1

在 VBScript 中,如何为多个文件夹/文件管理“Scripting.FileSystemObjects”,如 objFSO 和 objFolder?

在“主要”代码部分,我声明了“Scripting.FileSystemObject”的一个实例(全局)

    Set objFSO = CreateObject("Scripting.FileSystemObject")

然后,我执行一些操作,例如:

    If objFSO.FileExists(strOutputFilename) Then
        WScript.Echo "Deleting File: " & strOutputFilename
        objFSO.DeleteFile strOutputFilename
    End If

然后,在一个循环中,我得到一个文件夹,并将它传递给一个函数:

    For gintLoop = 0 to (ubound(arraySearchPath))
        wscript.echo "Processing folder:" & arraySearchPath(gintLoop)
        Set objFolderX = objFSO.GetFolder(arraySearchPath(gintLoop))
        Call DoWork (objFolderX, arrayParam1, arrayParam2)
    Next

至此,一切都清楚了……

现在,在函数中,我执行以下操作:
a) 从 objFolder 收集文件名

    Set lobjFolder = objFSO.GetFolder(objFolderX.Path)  
    Set lcolFiles = lobjFolder.Files

b)检查其他(不相关)路径中是否存在文件

c) 获取各种文件的大小:

    lcurInputFileSize = CCur(lobjFile.Size)

d) 删除各种文件

e) 打开文件进行阅读

    For Each lobjFile in lcolFiles
        lstrTargetFile = lobjFolder.Path & "\" & lobjFile.Name
        Set lobjInputFile = objFSO.OpenTextFile(lstrTargetFile, ForReading)
    ...

f) 打开文件进行写入

    Set lobjOutputFile = objFSO.OpenTextFile(strOutputFilename, ForAppending, True)

g)调用传递各种对象的其他子/函数

h) 递归调用(相同的)函数来处理其他文件夹

    For Each lobjSubfolderY in objFolderX.SubFolders
        Call DoWork (lobjSubfolderY, arrayParam1, arrayParam2)
    Next

我担心的是我需要确保 FileSystemObjects 的各种用途(如文件夹路径、打开的文件等)不会被 FileSystemObjects 的以后使用“踩踏”。

问题 1:我是否需要(或建议)为“Main”和每个(或某些)子/函数有一个单独的“Scripting.FileSystemObject”(objFSO)实例?

问题 2:同样,我如何管理各种其他对象以避免丢失数据?

凯文

4

1 回答 1

1

Q1:不,您不需要 Scripting.FileSystemObject 的多个实例。

对象上的方法都是静态的。

事实上,Scripting Runtime Reference 的文档表明 FSO 是一个单例,尽管它没有使用这个词:

您只能创建 FileSystemObject 对象的一个​​实例,无论您尝试创建另一个实例多少次。

来自: http: //msdn.microsoft.com/en-us/library/2z9ffy99 (v=vs.84).aspx

WScript.CreateObject("Scripting.FileSystemObject")根据我的经验,多次调用不会导致错误。后续调用的返回值很可能只是最初创建的 FSO 的副本。

至于你的问题2,我不明白。我认为您指的是 FSO 返回的对象,Folder、File、TextStream 等类型的对象。

像对待任何其他有状态的对象一样对待它们。你可以有多个实例,如果你想进行递归,你需要将它们作为基于堆栈的参数传递。

于 2012-06-24T18:06:10.883 回答