关于vba:在遍历文件时使用FileSystemObject重命名文件

Rename a file with FileSystemObject while looping through files

作为序言,我正在使用Access 2003编写代码,但将使用户使用Access 2013,因此我需要使两者兼容。我有一个循环,该循环使用Application.FileSearch遍历目录中的许多文件。据我了解,Access的较新版本已弃用此功能,因此我必须使用" For Each"来遍历文件。

这是我要更改的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

这是我将其替换为的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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()函数知道可以使用该名称的文件。然后,它会将文件及其原始文件名移到"已处理"子文件夹中。

这在原始代码中工作正常。新代码似乎可以正常工作,除了在启动Process()之前找不到将文件重命名为" SourceCode.txt"的方法外。我尝试了几种方法,但始终出错。在上面的代码中,我尝试了" f1.Name = strFileName"。这给我一个"权限被拒绝"错误。我尝试使用FileCopy,然后使用原始文件上的Kill命令,但是Kill命令返回了错误。我怀疑FileSystemObject锁定了文件,因此无法移动或杀死该文件。但是旧版本的代码可以毫无问题地移动它。


之所以会显示"权限被拒绝",是因为您试图在使用文件时通过objFSO.OpenTextFile重命名文件。 这与fs.GetFile不同,在原始代码中没有-您需要吗? 它返回您以后不再使用的TextStream

无论如何,在打开文件之前将f1.Name = strFileName移至,或者在完成处理后,调用objFile.Close然后重命名。