Отказано в доступе при перемещении или удалении последнего файла в папке

У меня есть процедура MS Access VBA внутри модуля, который имеет цикл для каждого файла в определенной папке.

Внутри цикла я создаю новый файл в отдельной папке, которая затем заполняется очищенными данными из файла в цикле. Я импортирую данные нового файла в базу данных SQL Server 2005. После успешного импорта скрипт удаляет очищенный файл и пытается переместить (или скопировать/удалить) файл в цикле в подпапку архива в том же каталоге.

Зацикливание файлов работает со всеми файлами в зацикленной папке... кроме последнего файла. Именно тогда появляется сообщение об отказе в доступе.

Сообщение об ошибке в вышеупомянутых обстоятельствах всегда появляется в одном из следующих (я пробовал несколько похожих команд):

fso.MoveFile
fso.DeleteFile (just after copy)
f.Move
f.Delete (just after copy)
Name origin As destination

Вот мой код:

Dim fso As New Scripting.FileSystemObject
Dim f As file
Dim processingFiles As Files

If fso.FolderExists(incomingPath) Then
    Set processingFiles = fso.GetFolder(incomingPath).Files
End If

For Each f In processingFiles

    /*this is where the create a new file and clean it part runs - works fine*/

    If fso.FileExists(archivePathFile) Then
        Kill archivePathFile
    End If

    If fso.FileExists(tempPath & "\cleaned_processing_file.txt") Then
        Kill tempPath & "\clean_processing_file.txt"
    End If


    f.Move archivePathFile   '<------------- Permission Denied, last file in folder
    Debug.Print f.Name & " is now in " & incomingPath & "\Archive"

    'f.Copy archivePathFile, True 
    'f.Delete True '<----------------------- Permission Denied, last file

    'Name origPathFile As archivePathFile '< Path/File access error, last file

Next '<--- For Each Loop

person coge.soft    schedule 15.03.2013    source источник
comment
Включает ли ваша коллекция processingFiles какие-либо системные файлы, такие как desktop.ini, которые могут помешать работе?   -  person Gord Thompson    schedule 15.03.2013
comment
Он содержит только файлы .txt. Единственная вложенная папка — это папка архива. Только чтение отключено для всех файлов и папок (включая processingFiles). Я могу без проблем перемещать тысячи файлов в подпапку архива; это просто последний файл, который доставляет мне неприятности.   -  person coge.soft    schedule 15.03.2013
comment
Я полагаю, вы пробовали debug.print f.Name перед каждым перемещением/удалением, чтобы убедиться, что проблема не в скрытом файле. Вы должны вставить строку DoEvents после импорта SQL, чтобы позволить SQL работать, но это не объясняет, почему всегда последний файл вызывает проблему.   -  person grahamj42    schedule 16.03.2013
comment
Я ценю совет DoEvents, @grahamj42. Я узнал об этом трюке на собственном горьком опыте. Да, у меня было Debug.Print "File Name is: " & f.Name - фактически чуть ниже DoEvents. Я могу подтвердить, что это всегда последний файл в коллекции файлов. Я даже установил счетчик Exit For для первых двух файлов в целях тестирования ... второй файл не будет работать (отказано в доступе). Затем я попробовал все 25 000 файлов ... последний файл не работал (отказано в доступе).   -  person coge.soft    schedule 16.03.2013
comment
Вы говорите Я даже установил счетчик Exit For для первых двух файлов в целях тестирования... второй файл не будет выполнен, но если вы уже вышли из цикла, делаете ли вы что-то с f после цикл выходит?   -  person grahamj42    schedule 16.03.2013
comment
Хороший вопрос, но нет. Ничего не происходит после Next.   -  person coge.soft    schedule 16.03.2013
comment
@grahamj42 спасибо за помощь. Я смог заставить его работать; окольным путем.   -  person coge.soft    schedule 18.03.2013


Ответы (2)


Я публикую это как «ответ», чтобы код отображался, но вам (очевидно) не нужно его принимать...

Я только что проверил минимальный случай ...

Sub move_to_foo()
Dim fso As New FileSystemObject
Dim processingFiles As Files, f As File
Set processingFiles = fso.GetFolder("C:\__tmp").Files
For Each f In processingFiles
    Debug.Print "Moving """ & f.Name & """..."
    f.Move "C:\__tmp\foo\" & f.Name
Next
End Sub

...и последний файл в папке не завершается ошибкой, поэтому ваша проблема должна быть чем-то специфичным для вашего кода. Если вы решите отредактировать свой вопрос и предоставить более подробную информацию, я буду рад помочь, но сейчас на ваш вопрос, как указано, нет ответа.

person Gord Thompson    schedule 15.03.2013
comment
Спасибо за вашу помощь. Я не мог заставить его работать так, как должен. Я могу только предположить, что, возможно, утилита, которая пишет в папку, вызывает какую-то блокировку. Я заставил это работать, скопировав файлы во временную папку, зациклившись на ней и переместив живые файлы в архив внутри цикла. оказавшись вне цикла, я удаляю файлы во временной папке без проблемы с отказом в разрешении. - person coge.soft; 18.03.2013

У меня была точно такая же проблема, как у вас. Все файлы будут перемещены из исходного каталога в целевой напрямую, за исключением последнего, что приведет к отображению «Отказано в доступе». Это произошло бы, если бы было 2 файла или 30 файлов. Я копировал данные из файлов в базу данных SQL до того, как файлы были перемещены. Решение состоит в том, чтобы установить для объектов значение «Ничего» после того, как они используются для анализа файлов и вставки данных SQL.

Например, после вставки данных сценария SQL файлы можно перемещать. Освободите ресурсы объекта:

Set objFSO = Nothing
Set objTextFile = Nothing
person swechsler    schedule 18.05.2013