移动或删除文件夹中的最后一个文件时拒绝权限

时间:2013-03-15 15:51:14

标签: ms-access foreach access-vba file-management filesystemobject

我在一个模块中有一个MS Access VBA过程,该过程对每个特定文件夹中的文件都有一个循环。

在循环中,我在一个单独的文件夹中创建一个新文件,然后在循环中用文件中的清理数据填充。我将新文件的数据导入SQL Server 2005数据库。成功导入后,脚本将删除已清理的文件,并尝试将循环中的文件移动(或复制/删除)到同一目录中的存档子文件夹。

  

文件循环在循环文件夹中的所有文件上都能正常工作...除了最后一个文件。当弹出Permission Denied错误时。

在上述情况下,错误信息总是发生在下列之一上(我已尝试过几个类似的命令):

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

2 个答案:

答案 0 :(得分:1)

我将此作为“回答”发布,因此代码会显示,但您(显然)不必接受它......

我刚测试了最小的情况...

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

...并且文件夹中的最后一个文件没有失败,因此您的问题必须是您的代码所特有的。如果您选择编辑问题并提供更多详细信息,那么我将很乐意为您提供帮助,但现在您的问题 - 如上所述 - 没有答案。

答案 1 :(得分:1)

我和你有完全相同的问题。 除最后一个文件外,所有文件都将从源目录直接移动到目标,这将导致显示“Permission Denied”。如果有2个文件或30个文件,就会发生这种情况。 在移动文件之前,我正在将文件中的数据复制到SQL数据库。 解决方案是在用于解析文件和插入SQL数据后将对象设置为“Nothing”。

例如,插入SQL脚本数据后,可以移动文件。释放对象资源:

Set objFSO = Nothing
Set objTextFile = Nothing