Переименуйте файл с помощью FileSystemObject при циклическом просмотре файлов

В качестве предисловия я пишу код в 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 блокирует файл, поэтому его нельзя переместить или убить. Но старая версия кода смогла перенести его без проблем.


person Michael T    schedule 08.08.2013    source источник


Ответы (1)


Вы получаете «Отказано в доступе», потому что пытаетесь переименовать файл, когда он используется, а именно objFSO.OpenTextFile. Это отличается от fs.GetFile и отсутствует в вашем исходном коде — вам это нужно? Он возвращает TextStream, который вы впоследствии не используете.

В любом случае перед открытием файла переместите f1.Name = strFileName в или после завершения обработки вызовите objFile.Close, а затем переименуйте.

person mr.Reband    schedule 08.08.2013
comment
Вы совершенно правы. Мне не нужно было открывать файл в этой функции. Я думаю, что где-то взял образец кода для моделирования цикла «Для каждого», и эта часть была в нем. Его удаление решило проблему. Спасибо! - person Michael T; 08.08.2013