GetFiles

Автор Ципихович Эндрю, 1 января 2024, 18:13

0 Пользователи и 1 гость просматривают эту тему.

Ципихович Эндрю

сорри мой первый макрос на либре))
Sub GetFiles()

Dim oFS As Object
Dim aFiles As Variant

' Создаём объект для доступа к файловой системе
oFS = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")

' Получаем список файлов в указанной папке
aFiles = oFS.getFolderContents(myPath)

' Выводим список файлов
For Each sFile In aFiles
Print sFile
Next

End Sub
не хочет работать, ругается на строку:
aFiles = oFS.getFolderContents(myPath)
как подправить?

mikekaganski

myPath где определён?
С уважением,
Михаил Каганский

Ципихович Эндрю

Цитата: mikekaganski от  1 января 2024, 18:17myPath где определён?
чуть выше
Dim myPath As String
myPath = "file:///I:/Российская Федерация/"
извините, забыл весь выложить

mikekaganski

Цитата: Ципихович Эндрю от  1 января 2024, 18:22myPath = "file:///I:/Российская Федерация/"

"file:///I:/Российская Федерация/" - это некорректный URL. Пути не конвертируются в URL простой заменой обратных слэшей на прямые. Там достаточно сложная кодировка.

Преобразуйте файловые пути так:

myPath = ConvertToURL("I:\Российская Федерация\")
С уважением,
Михаил Каганский

Ципихович Эндрю

не понял, а как проверку прошло:
Dim myPath As String
myPath = "file:///I:/Российская Федерация/"
Dim bExists As Boolean
bExists = oFS.exists(sPath)

If bExists Then
Print "Каталог " & myPath & " существует, программа далее продолжает свою работу."
а что по вопросу в 1-м посту?

mikekaganski

В сообщении он говорит, что ожидает 2 аргумента, а передан 1. И документация говорит, что в getFolderContents передаются строка-URL и логическое значение "перечислять папки".

aFiles = oFS.getFolderContents(myPath, false)
С уважением,
Михаил Каганский

Ципихович Эндрю

спасибо за ответ, и наверное у каждого новичка без этого никак, код:
Sub GetFiles()

REM Print "Выведет 'Предупреждение'"
Dim myPath As String
myPath = "I:\Российская Федерация\"
Dim oFS As Object
' Создаём объект для доступа к файловой системе
oFS = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
' Проверяем существование каталога
If Not oFS.exists(myPath) Then
Print "Каталог " & myPath & " не существует, программа далее не будет продолжаться."
Exit Sub
End If
Dim aFiles As Variant
' Получаем список файлов в указанной папке
aFiles = oFS.getFolderContents(myPath, false)
' Выводим список файлов
For Each sFile In aFiles
Print sFile
Next

End Sub
работает как надо, как убрать крякозябры, которые выводит Print?, в именах файлов, конечно пробелы есть и есть кириллица

bigor

Поддержать наш форум можно здесь

Ципихович Эндрю

bigor, спасибо за ответ
работает, как нужно, а крякозябры можно убрать у всего списка aFiles сразу, как?
мой финальный код:
Sub GetFiles()

REM Print "Выведет 'Предупреждение'"
Dim myPath As String
myPath = "I:\Российская Федерация\"
Dim oFS As Object
' Создаём объект для доступа к файловой системе
oFS = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
' Проверяем существование каталога
If Not oFS.exists(myPath) Then
Print "Каталог " & myPath & " не существует, программа далее не будет продолжаться."
Exit Sub
End If
Dim aFiles As Variant
' Получаем список файлов в указанной папке
aFiles = oFS.getFolderContents(myPath, false)
REM Print aFiles НЕ выведет список
Dim sFilesConver As String
sFilesConver = ""
' Цикл по списку файлов
For Each sFile In aFiles
' Print ConvertFromUrl(sFile) REM ConvertFromUrl - убирает крякозябры
sFilesConver = sFilesConver & ConvertFromUrl(sFile) & Chr(13)
Next

Print sFilesConver

End Sub
так как файлов 30 штук по получается, что для Print это большая портянка и он её отображает не за раз, но почему мне показывает этот список файлов за три раза, а не за два раза - загадка
то есть Print показал:
путь 1 файла
путь 1 файла
путь остальных файлов
можете пояснить по этому вопросу

bigor

скрипт с использованием библиотеки scriptforge
sub filesort
Dim arr, arr1
Dim i As Long, sDir As String
Dim sFileName
sDir="/home/bigor/Test1/"
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
sfilename=files(sDir)
redim arr(1,ubound(sfilename))
for i= 0 to ubound(sfilename)
arr(0,i)=int(split(getname(sfilename(i)),".")(0))
arr(1,i)=convertfromurl(sfilename(i))
Next
arr1=sortcolumns(arr,0)
for i=0 to ubound(sfilename)
print arr1(1,i)
next
end sub
Поддержать наш форум можно здесь

Ципихович Эндрю

спасибо за ответ, так как файлов у меня 30, принт делит вывод на несколько выводов
если я изменил концовку кода
на
arr1=sortcolumns(arr,0)
Dim sFiles_print As String
sFiles_print = ""
for i=0 to ubound(sfilename)
' print arr1(1,i)
sFiles_print = sFiles_print & arr1(1,i) & Chr(13)
next

print sFiles_print
как последнюю строку изменить на:
1 сделать документ пустым\чистым
2 поместить на него вывод
?? спасибо

bigor

Цитата: Ципихович Эндрю от  2 января 2024, 14:271 сделать документ пустым\чистым
2 поместить на него вывод
вам просто нужно было имена файлов вывести в текстовый документ? Зачем тогда массив, можно было заполнить таблицу и отсортировать её
Поддержать наш форум можно здесь

Ципихович Эндрю

Цитата: bigor от  2 января 2024, 14:38вам просто нужно было имена файлов вывести в текстовый документ?
нет это нужно для заполнения вакуума это я об отсутствии Immediate, Debug.Print и для общего развития))
в тоже время ещё не разобрался как Python скрипты выполнять в либре и вероятно информация о том, куда выводит Pythonовские print() тоже будет за семью печатями))

bigor

замените print на msgbox 
Поддержать наш форум можно здесь

Ципихович Эндрю

Цитата: bigor от  2 января 2024, 15:43замените print на msgbox 
даже к гадалке ходить не нужно, что msgbox как и print не выведет большую портянку + в них обоих нельзя скопировать + это нужно
Цитата: Ципихович Эндрю от  2 января 2024, 15:38для общего развития))