В качестве предисловия я пишу код в Access 2003, но у меня будут пользователи, использующие Access 2013, поэтому мне нужно, чтобы он был совместим для обоих. У меня есть цикл, который использует Application.FileSearch для перебора нескольких файлов в каталоге. Насколько я понимаю, это устарело в более новой версии Access, поэтому я должен использовать «Для каждого» для циклического просмотра файлов.
Вот кусок кода, который я меняю:
strPath = CurrentProject.Path & "\Files\"
strFileName = "SourceCode.txt"
With Application.FileSearch
.FileName = "*.txt"
.LookIn = strPath
.Execute
intFileCount = .foundfiles.Count
For x = 1 To intFileCount
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFile(.foundfiles(x))
strNewFileName = Right((.foundfiles(x)), Len((.foundfiles(x))) - (InStr((.foundfiles(x)), "Files\") + 5))
fs.MoveFile f, strPath & strFileName
'Run the Process() function
Process
FileCopy strPath & strFileName, strPath & "Processed\" & strNewFileName
Kill strPath & strFileName
Next x
End With
И вот код, которым я его заменяю:
strPath = CurrentProject.Path & "\Files\"
strFileName = "SourceCode.txt"
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(strPath)
Set fc = f.Files
For Each f1 In fc
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strPath & f1.Name, 1)
strNewFileName = f1.Name
f1.Name = strFileName
'Run the Process() function
Process
FileCopy strPath & strFileName, strPath & "Processed\" & strNewFileName
Kill strPath & strFileName
Next
Этот код перебирает каждый файл, а затем запускает функцию Process(), которая вносит изменения в файл. Итак, как я это делаю, он изменяет активный файл на имя «SourceCode.txt», тогда функция Process() знает, что работает с файлом с таким именем. Затем он перемещает файл в подпапку «Обработанные» с исходным именем файла.
Это отлично работало в исходном коде. Новый код, кажется, в основном работает, за исключением того, что я не могу найти способ переименовать файл в «SourceCode.txt» перед запуском Process(). Я пробовал несколько способов, но я продолжаю получать ошибки. В приведенном выше коде я попробовал «f1.Name = strFileName». Это дает мне ошибку «Отказано в доступе». В качестве альтернативы я попытался использовать FileCopy, а затем команду Kill для исходного файла, но команда Kill вернула ошибку. Я подозреваю, что FileSystemObject блокирует файл, поэтому его нельзя переместить или убить. Но старая версия кода смогла перенести его без проблем.