作为前言,我在 Access 2003 中编写代码,但会有用户使用 Access 2013,因此我需要它兼容两者。我有一个循环,它使用 Application.FileSearch 循环浏览目录中的许多文件。据我了解,这在较新版本的 Access 中已被弃用,因此我必须使用“For Each”来循环文件。
这是我正在更改的代码:
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() 函数知道使用该名称的文件。然后它将文件移动到具有原始文件名的“已处理”子文件夹。
这在原始代码中运行良好。新代码似乎大部分都可以工作,除了在启动 Process() 之前我找不到将文件重命名为“SourceCode.txt”的方法。我尝试了几种方法,但我不断收到错误。在上面的代码中,我尝试了“f1.Name = strFileName”。这给了我一个“权限被拒绝”错误。我尝试交替使用 FileCopy,然后对原始文件使用 Kill 命令,但 Kill 命令返回错误。我怀疑 FileSystemObject 正在锁定文件,因此无法移动或杀死它。但是旧版本的代码可以毫无问题地移动它。