Вопрос по FSO и как проверить целостность файла? - PullRequest
0 голосов
/ 20 января 2019

Для экспорта файлов PDF и Excel из одного приложения используется одна кнопка.После завершения экспорта я буду отправлять электронные письма со всеми этими файлами в виде вложений, но в действительности я сталкиваюсь с двумя проблемами при выполнении описанных ниже процедур.Существуют ли другие решения для проверки целостности экспортируемых файлов?

  1. Процедура ListFiles

    Как и в случае процедуры ListFiles, иногда, когда я нажимаю кнопку экспорта, в этой строке появляется одно сообщение об ошибке 'Str $ = Obj.Path', в нем указано «Файл не найден», в локальном окне VBA я вижу, что все атрибуты варианта Obj отображаются как «ошибка приложения или объекта».Если я позволю процедуре ListFiles запускаться через несколько секунд после нажатия на эту кнопку экспорта, она пройдет гладко.

  2. Процедура ReadFiles и AccessRight

    В процессе экспортафайл появится в одной целевой папке с его размером в 0 байт в начале, а затем через несколько секунд его размер станет больше и больше.Таким образом, с помощью этих двух процедур я могу определить, занят ли один файл другим назначением или нет.Если все загруженные файлы не заняты, я прикреплю их в одном письме и отправлю.Но при фактическом запуске из этого приложения появится одно окно с ошибкой, в котором говорится, что «файл открыт другими приложениями».На мой взгляд, я полагаю, что файл может быть занят этой строкой в ​​моей процедуре AccessRight: «Открыть FilePath для двоичной блокировки, прочитать запись как # 1»

Sub ListFiles()
    Dim FSO As Object
    Dim FSO_Folder As Object
    Dim myPath$
    Dim Obj
    Dim Str$
    Dim k1 As Long

    myPath$ = "C:\Users\jim\Desktop\UIAutomation_VBA-master"
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set FSO_Folder = FSO.GetFolder(myPath)
    For Each Obj In FSO_Folder.Files
            Str$ = Obj.Path
    Next Obj
End Sub

Sub ReadFiles()
    Dim FSO As Object
    Dim FSO_Folder As Object
    Dim myPath$
    Dim Obj
    Dim Str$
    Dim k1 As Long

    myPath$ = "C:\Users\jim\Desktop\UIAutomation_VBA-master"
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set FSO_Folder = FSO.GetFolder(myPath)

    Do
        k1 = 0
        For Each Obj In FSO_Folder.Files
            k1 = k1 + AccessRight(Obj.Path)
        Next Obj
        DoEvents
    Loop Until k1 = FSO_Folder.Files.Count
End Sub

Function AccessRight(ByVal FilePath As String) As Long
    On Error GoTo The_end

    AccessRight = 0
    Open FilePath For Binary Lock Read Write As #1
    Close #1
    AccessRight = 1

The_end:
End Function
...