1

VBScript で、複数のフォルダー/ファイルの objFSO や objFolder のような "Scripting.FileSystemObjects" を管理するにはどうすればよいですか?

「メイン」コード セクションで、「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: 「メイン」と各 (または一部の) サブ/関数に対して「Scripting.FileSystemObject」(objFSO) の個別のインスタンスが必要ですか (または推奨されますか) ?

質問 2: 同様に、他のさまざまなオブジェクトを管理して、データが失われないようにするにはどうすればよいですか?

ケビン

4

1 に答える 1

1

Q1 : いいえ、Scripting.FileSystemObject の複数のインスタンスは必要ありません。

オブジェクトのメソッドはすべて静的です。

実際、Scripting Runtime Reference のドキュメントでは、FSO はsingletonであると示されていますが、次の言葉は使用されていません。

別のインスタンスを何回作成しようとしても、FileSystemObject オブジェクトのインスタンスを 1 つしか作成できません。

から: 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 に答える