【问题标题】:In VBScript, how do I manage "Scripting.FileSystemObjects" like objFSO and objFolder for multiple folders/files?在 VBScript 中,如何为多个文件夹/文件管理“Scripting.FileSystemObjects”,如 objFSO 和 objFolder?
【发布时间】:2012-06-26 03:03:47
【问题描述】:

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

在“Main”代码部分,我声明了一个“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: 同样,如何管理各种其他对象以避免丢失数据?

凯文

【问题讨论】:

    标签: scripting vbscript multiple-instances filesystemobject


    【解决方案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 等类型的对象。

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

    【讨论】:

    • Q1:谢谢...我看到有关创建多个 objFSO 的信息相互矛盾。这是第一次有人提到解释和确认它的文件。 Q2:是的,我说的是文件夹、文件等。就“基于堆栈的参数”而言,您是指作为参数传递给子/函数调用的项目吗? ...我认为这些应该是“ByRef”而不是“ByVal”。
    • 是的,我就是这个意思。对象将通过 ref 传递,但这不是您需要担心的。只需专注于为您正在摆弄的每个文件或文件夹维护一个不同的对象实例。
    • 在您的帮助下,我得以解决问题,再次感谢。我还在递归函数中发现了一个 objFile,它总是为同一个文件(日志文件)“设置”。因此,我在“Main”程序中将其更改为 Dim(med),因此它现在是一个全局对象。
    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    相关资源
    最近更新 更多