Вопрос по FSO и как проверить целостность файла?
Для экспорта файлов PDF и Excel из одного приложения используется одна кнопка. После завершения экспорта я буду отправлять электронные письма со всеми этими файлами в виде вложений, но в действительности я сталкиваюсь с двумя проблемами при выполнении описанных ниже процедур. Существуют ли другие решения для проверки целостности экспортируемых файлов?
Процедура ListFiles
Что касается процедуры ListFiles, иногда, когда я нажимаю на кнопку экспорта, в этой строке появляется одно окно ошибки "Str$ = Obj.Path", в котором говорится "Файл не найден", в локальном окне VBA я вижу, что все атрибуты варианта Obj отображаются как "ошибка приложения или объекта". Если я позволю процедуре ListFiles запускаться через несколько секунд после нажатия на эту кнопку экспорта, она пройдет гладко.
Процедура ReadFiles и AccessRight
В процессе экспорта файл появится в одной целевой папке с размером в 0 байт в начале, а затем через несколько секунд его размер станет больше и больше. Таким образом, с помощью этих двух процедур я могу определить, занят ли один файл другим назначением или нет. Если все загруженные файлы не заняты, я прикреплю их в одном письме и отправлю. Но при фактическом запуске из этого приложения появится одно окно с ошибкой, в котором говорится, что "файл открыт другими приложениями". На мой взгляд, я полагаю, что файл может быть занят этой строкой в моей процедуре AccessRight, "Открыть FilePath для двоичной блокировки" Read Write # #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