Функция определения наличия файла в заданной папке

Автор luu, 7 февраля 2024, 11:56

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

luu

Пытаюсь написать функцию, которая будет проверять наличие в данной папке и записывать его в переменную, если он находится или выдавать сообщение о том что он не найден в противном случае.

Но что-то у меня не получается. Что я делаю не так?

Sub Test2

GlobalScope.BasicLibraries.LoadLibrary("Tools")
Dim searchDir, FolderName as String
Dim File As Object

searchDir = DirectoryNameoutofPath(ThisComponent.URL, "/") 'Определяем текущую директорию исходного открытого файла
FolderName = convertFromURL(SearchDir) 'вносим в переменную FolderName значение текущей папки
Print searchDir
Print FolderName

File = CheckFileExist ("/File.ods", FolderName)
' Print File

End Sub

' -------------------------------------------------------------------------------------------------
' Проверка наличия файла FName (/Fname.ods) в папке FolderName/
Function CheckFileExist (Byval FName as String, ByVal FolderName As String) As Object
  On Error GoTo ErrLabel
  f = FName
If  FileExists(FolderName & FName) Then
CheckFile = StarDesktop.loadComponentFromUrl(convertToURL(FolderName & FName), "_blank", 0, Prop())
ResCheck = "Файл "& f &" определен"
Print ResCheck
CheckFileExist = CheckFile
else
ResCheck = "Файл "& f &" НЕ НАЙДЕН!"
Print ResCheck
Endif
  Exit Function
Errlabel: 
End Function   

mikekaganski

Цитата: luu от  7 февраля 2024, 11:56Но что-то у меня не получается. Что я делаю не так?

Во-первых, Вы не пишете, что конкретно не получается. Для того, чтобы что-то посоветовать, Вы требуете от помогающих проделать дополнительные действия - чтобы понять, что и как именно не работает.
Во-вторых, Вы, похоже, не пользуетесь отладкой. Потому что попытавшись отследить работу функции CheckFileExist по шагам, Вы естественным образом увидели бы, что на шаге

StarDesktop.loadComponentFromUrl(convertToURL(FolderName & FName), "_blank", 0, Prop())
она перескакивает в обработчик ошибок. И затем Вы могли бы закомментировать строку

On Error GoTo ErrLabel
чтобы увидеть:

ЦитироватьError

BASIC runtime error.
Object variable not set.

Затем Вы могли бы посмотреть, что именно в этой команде могло бы не быть задано, и обнаружили бы Prop.
С уважением,
Михаил Каганский

luu

Объявил переменные, прописал prop. Все получилось
Спасибо

luu

Не могу разобраться с выводом функции в случае отрицательного результата (файла не существует). Т.е. функция отрабатывает нормально, сообщает о том что файл не найден, но как возвратить значение?
Здесь ребята пишут, что есть решение: https://forum.openoffice.org/en/forum/viewtopic.php?t=87575
Но у меня не получается. Пробовал и Nothing при переменных Object и Null при Variant, но не получается.

Вызываю функцию из основного макроса. Условие File=Null не выполняется, соответственно код выполняется дальше, а мне нужно его отловить на этом этапе и закончить выполнение процедуры. Куда копать?
Sub Test2
   
    Dim searchDir, FolderName, SheetName, FileName as String
    Dim oDoc, oSheet, oRange As Object
    Dim File As Variant



    searchDir = DirectoryNameoutofPath(ThisComponent.URL, "/")    'Определяем текущую директорию исходного открытого файла
    FolderName = convertFromURL(SearchDir)    'вносим в переменную FolderName значение текущей папки
'    Print searchDir
'    Print FolderName
   
    FileName = "/File1.ods"
   
    File = CheckFileExist (FileName, FolderName)        '    Проверяем, существует ли такой файл в текущей папке (папке документа)
        if File=Null then
            print "Скрипт закончил работу, файла не существует"
            Goto FileDoesNotExist
        Endif
    oDoc = File        'вносим результат функции в переменную oDoc
   
    oSheet=oDoc.Sheets.getByName("График")
   
FileDoesNotExist:
   
End Sub

Функция:
' -------------------------------------------------------------------------------------------------
' Проверка наличия файла FName (/Fname.ods) в папке FolderName/
Function CheckFileExist (Byval FName as String, ByVal FolderName As String) As Variant

    Dim prop(0) as new com.sun.star.beans.PropertyValue
    prop(0).Name="Hidden"
    prop(0).Value= true

  Dim f, ResCheck As String
  Dim CheckFile As Object
  On Error GoTo ErrLabel
      f = FName
    If  FileExists(FolderName & FName) Then
        CheckFile = StarDesktop.loadComponentFromUrl(convertToURL(FolderName & FName), "_blank", 0, Prop())
        ResCheck = "Файл "& f &" определен"   
        'Print ResCheck
        CheckFileExist = CheckFile
    else
        ResCheck = "Файл "& f &" НЕ НАЙДЕН!"   
        Print ResCheck
        CheckFileExist=Null
    Endif
  Exit Function
Errlabel: 
End Function 

mikekaganski

С уважением,
Михаил Каганский

luu

Цитата: mikekaganski от 14 февраля 2024, 12:05
Цитата: luu от 14 февраля 2024, 11:46Куда копать?

Копайте в сторону функции IsNull.

Спасибо, все встало на свои места  :beer:
...
File = CheckFileExist (FileName, FolderName)
if IsNull(File) then
...