我可以使用 FileSystemObject 使用其索引从文件夹中获取单个文件吗?
Can I use FileSystemObject get a single file from a folder using its index?
如果一个文件夹中只有一个文件,我可以在不知道其名称或遍历文件夹中的文件的情况下获取它吗?
(代码是VBS,但可以是任何东西,FSO是这里有趣的部分。)
这对我不起作用:
dim fso
set fso = CreateObject("Scripting.FileSystemObject")
dim myFolder
Set myFolder = fso.getFolder("E:\test")
Dim myfiles
Set myfiles = myFolder.Files
WScript.Echo myfiles.Item(0).Path
WScript.Echo myfiles(0).Path
也没有用。 (索引 0,1 已测试,均失败。)
使用 a for each 只获取一个文件似乎有点矫枉过正。另外,我不应该能够以某种方式使用简单的 For
循环而不是 For Each
进行迭代吗?所以必须有索引...我似乎找不到它们。
不,您不能在不知道文件名称或遍历文件夹中的文件的情况下选择文件,至少不能使用 FileSystemObject
实例。由于 documented Files
集合的 Item
属性 需要项目的 name,而不是它的索引:
Item Property (Files)
Gets the specified item for in a Files object
Syntax
object.Item(key)[ = newitem]
Arguments
object
Required. The name of a File object.
spec
Required. The name of the item.
并非每个集合都允许按索引访问。
如果您正在寻找魔术,您可以这样做:
dir = "C:\your\folder"
Set sh = CreateObject("WScript.Shell")
Set ex = sh.Exec("cmd /c dir /b """ & dir & """")
While ex.Status = 0 : WScript.Sleep 100 : Wend
filename = Split(ex.StdOut.ReadAll, vbNewLine)(0)
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(fso.JoinPath(dir, filename))
但是,这种方法既不是很优雅也不是很健壮,而且我看不出它比
这样的方法有什么优势
dir = "C:\your\folder"
Set fso = CreateObject("Scripting.FileSystemObject")
For Each item In fso.GetFolder(dir).Files
Set f = item
Next
使用 Shell 个对象是可能的,就像你想的那样。
dim shellApp
set shellApp = CreateObject("Shell.Application")
dim myFolder
Set myFolder = shellApp.NameSpace("E:\test")
Dim myfiles
Set myfiles = myFolder.Items 'also contains subfolders
WScript.Echo myfiles.Item(0).Path
'and for loop
Dim i
For i = 0 To myfiles.Count - 1
WScript.Echo myfiles.Item(i).Path
Next
如果您完全确定文件夹中只有一个文件,只需一行代码即可:
Set MyFile = FSO.GetFile("E:\test\" & Dir("E:\test\"))
...至少它对我有用 Excel VBA.
如果一个文件夹中只有一个文件,我可以在不知道其名称或遍历文件夹中的文件的情况下获取它吗?
(代码是VBS,但可以是任何东西,FSO是这里有趣的部分。)
这对我不起作用:
dim fso
set fso = CreateObject("Scripting.FileSystemObject")
dim myFolder
Set myFolder = fso.getFolder("E:\test")
Dim myfiles
Set myfiles = myFolder.Files
WScript.Echo myfiles.Item(0).Path
WScript.Echo myfiles(0).Path
也没有用。 (索引 0,1 已测试,均失败。)
使用 a for each 只获取一个文件似乎有点矫枉过正。另外,我不应该能够以某种方式使用简单的 For
循环而不是 For Each
进行迭代吗?所以必须有索引...我似乎找不到它们。
不,您不能在不知道文件名称或遍历文件夹中的文件的情况下选择文件,至少不能使用 FileSystemObject
实例。由于 documented Files
集合的 Item
属性 需要项目的 name,而不是它的索引:
Item Property (Files)
Gets the specified item for in a Files object
Syntax
object.Item(key)[ = newitem]
Arguments
object
Required. The name of a File object.spec
Required. The name of the item.
并非每个集合都允许按索引访问。
如果您正在寻找魔术,您可以这样做:
dir = "C:\your\folder"
Set sh = CreateObject("WScript.Shell")
Set ex = sh.Exec("cmd /c dir /b """ & dir & """")
While ex.Status = 0 : WScript.Sleep 100 : Wend
filename = Split(ex.StdOut.ReadAll, vbNewLine)(0)
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(fso.JoinPath(dir, filename))
但是,这种方法既不是很优雅也不是很健壮,而且我看不出它比
这样的方法有什么优势dir = "C:\your\folder"
Set fso = CreateObject("Scripting.FileSystemObject")
For Each item In fso.GetFolder(dir).Files
Set f = item
Next
使用 Shell 个对象是可能的,就像你想的那样。
dim shellApp
set shellApp = CreateObject("Shell.Application")
dim myFolder
Set myFolder = shellApp.NameSpace("E:\test")
Dim myfiles
Set myfiles = myFolder.Items 'also contains subfolders
WScript.Echo myfiles.Item(0).Path
'and for loop
Dim i
For i = 0 To myfiles.Count - 1
WScript.Echo myfiles.Item(i).Path
Next
如果您完全确定文件夹中只有一个文件,只需一行代码即可:
Set MyFile = FSO.GetFile("E:\test\" & Dir("E:\test\"))
...至少它对我有用 Excel VBA.