0

作为前言,我在 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 正在锁定文件,因此无法移动或杀死它。但是旧版本的代码可以毫无问题地移动它。

4

1 回答 1

2

您收到“Permission Denied”,因为您试图在使用文件时重命名文件,即通过objFSO.OpenTextFile. 这fs.GetFile与您的原始代码不同 - 您需要它吗?它返回TextStream您随后不使用的 a 。

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

于 2013-08-08T15:52:50.267 回答