2013-02-01 86 views
0

本质上,我想获取给定目录中的所有.zip文件的名称并解压缩它们。现在,我正在努力将文件的名称变成某种数组或列表。它正确地抓取文件,但我对VBScript一无所知,有人能指出我正确的方向吗?将项目添加到VBScript列表中的最佳方法?

Dim fileList 

    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    objStartFolder = "C:\Test" 

    Set objFolder = objFSO.GetFolder(objStartFolder) 
    Wscript.Echo objFolder.Path 

    Set colFiles = objFolder.Files 

    For Each objFile in colFiles 
     If UCase(objFSO.GetExtensionName(objFile.name)) = "ZIP" Then 
      Wscript.Echo objFile.Name 
      'Add file names to fileList variable 
     End If 
    Next 

回答

1

有...

' using vbArray 
ReDim fileArray(-1) 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
objStartFolder = "C:\Test" 

Set objFolder = objFSO.GetFolder(objStartFolder) 

For Each objFile In objFolder.Files 
    If UCase(objFSO.GetExtensionName(objFile.Name)) = "ZIP" Then 
     ReDim Preserve fileArray(UBound(fileArray) + 1) 
     fileArray(UBound(fileArray)) = objFile.Name 
    End If 
Next 

WScript.Echo Join(fileArray, vbNewLine) 

' using .NET ArrayList (as no biult-in Lists in VBScript) 
Dim fileList 
Set fileList = CreateObject("System.Collections.ArrayList") 

For Each objFile In objFolder.Files 
    If UCase(objFSO.GetExtensionName(objFile.Name)) = "ZIP" Then 
     fileList.Add objFile.Name 
    End If 
Next 

WScript.Echo Join(fileList.ToArray, vbNewLine) 

PPS:

是Files集合动态:

Set oFSO = CreateObject("Scripting.FileSystemObject") 
curDir = CreateObject("WScript.Shell").CurrentDirectory 

Set oFolder = oFSO.GetFolder(curDir) 
Set oFiles = oFolder.Files 

WScript.Echo "Files count: " & oFiles.Count 

Set oFile = oFSO.CreateTextFile(oFSO.GetTempName) 
oFile.Close 

WScript.Echo "Files count: " & oFiles.Count 

[编辑],但看起来像然后循环使用VBS快照Files集合,所以我们可以假定解压可以在不需要文件列表的情况下去安全。

+1

考虑使用普通的Dim fileArray和/或预先声明数组大小(ArrayList的.Capacity),因为使用.Files集合时,您在进入循环之前知道数字元素。 –

+0

不错的一点,同意(+1)。 –

1

由于您已经有一个集合中的文件(colFiles),第一个拥有项目集合的理由 - 依次处理它们 - 并不会让您将它们放在第二个列表中。为什么不直接解压每个文件而不是将其放入列表中?解压缩文件A不需要有关/访问文件夹中其他文件X的信息。因此,收集的第二个原因 - 在同一时间/处理一个物品时需要所有元素 - 也不适用。

如果你坚持第二个列表,所有都取决于你想要对它做什么/项目。如果您只想要一个名称列表,最简单的方法是将名称/路径作为关键字放在字典中。如果你想要名称排序,一个System.Collections.ArrayList/SortedList会更方便。如果您想使用文件的更多属性/属性(大小,日期,访问权限等) - a 断开连接的ADODB记录集将允许您将所有这些属性存储在(SQL)表中。

最后,但并非最不重要的,一个简单的原生的VBScript 阵列(尺寸为每个文件属性)可用于:正如你所知道的元素(colFiles.Count)的可能数目,您可以定义的大小循环之前的数组,循环中的项目分配以及ReDim在循环之后保留它。

请随你选,我会在本贴中添加示例代码。

P.S:

由于@Panayot给你的阵列和的ArrayList示例代码,这将是有意义的要求ADO记录集。

PPS:

对于烦恼的:

Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject") 
    Dim sDir : sDir  = "..\testdata\testFilesCollection" 

    Dim nFile, sFile, oFile, i 

    If oFS.FolderExists(sDir) Then oFS.DeleteFolder sDir 
    oFS.CreateFolder sDir 

    WScript.Echo "----- Creating", cnMax, "files" 
    For nFile = 1 To cnMax 
     sFile = nFile & ".txt" 
     oFS.CreateTextFile oFS.BuildPath(sDir, sFile) 
     WScript.Echo sFile, "created" 
    Next 
    WScript.Echo "----- Looping over", cnMax, "files and creating", cnMax, "more" 
    i = 0 
    For Each oFile In oFS.GetFolder(sDir).Files 
     If i <= cnMax Then 
     sFile = Chr(65 + i) & ".txt" 
     oFS.CreateTextFile oFS.BuildPath(sDir, sFile) 
     End If 
     i = i + 1 
     WScript.Echo oFile.Name, "seen", sFile, "created" 
    Next 
    WScript.Echo "----- Looping over", 2 * cnMax, "files" 
    For Each oFile In oFS.GetFolder(sDir).Files 
     WScript.Echo oFile.Name, "seen" 
    Next 

输出:

----- Creating 3 files 
1.txt created 
2.txt created 
3.txt created 
----- Looping over 3 files and creating 3 more 
2.txt seen A.txt created 
3.txt seen B.txt created 
1.txt seen C.txt created 
----- Looping over 6 files 
B.txt seen 
2.txt seen 
C.txt seen 
A.txt seen 
3.txt seen 
1.txt seen 

[该文件的集合是快照] == @ Panayot的论点/证据==>的For Each在Files集合的快照上循环 - 至少添加了这些内容。删除测试留作练习。

+0

这可能是一个非常具体的案例,虽然打扰了我,但如果我们将档案解压缩到同一个文件夹而不将它们存储在数组或列表中,我们是不是冒着解压和他们的子档案的风险呢?文件不是“快照”,而是动态收藏。 –

+0

@PanayotKarabakalov - 请参阅P.P.S. –

+0

我稍后可能会测试您的代码,但我看到您获得了新的Files集合实例,并以结论表明它不是动态的。现在我将编辑上面的答案,并附加一个非常简单的代码。 –

相关问题