此脚本收集文件夹中的所有文件,并通过将行数附加到文件名来重命名文件。所有文件都是.txt文件。该方法(因为fso.MoveFile
和fso.DeleteFile
太特殊,生成权限错误)是
除非集合中没有空文本文件,否则脚本可以正常工作。发生的情况是,使用新文件重建集合,然后脚本再次重命名文件。我知道我可以通过检查每个文件是否存在某些重复字符串来阻止这种情况,但我想知道发生了什么?为什么脚本会重建文件集并重新运行它们?这种情况一直持续到我杀死这个过程为止。
另一个有趣的事实是,如果我碰巧捕获一个空文本文件,我的消息会显示并且脚本停在那里,但仍然会再次处理集合中的第一个文件。请注意,空文件恰好是集合中的最后一个,但第一个文件再次被处理。
因此,通过设计,一个名为'ab0.txt'的创建文本文件被重命名为'ab0-15.txt',因为它有15行文本。这个新重命名的文件看起来像'ab0-15-15-15-15-15-15-15-15-15-15.txt'
问题:发生了什么事?是否有更好,更有效的方法来实现这一目标?
以下是与此问题相关的代码:
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder(strSaveTo)
Set colFiles = oFolder.Files
' Call Sub to copy and rename
ChangeFileName colFiles
MsgBox("File renaming complete.")
' Exit code
Sub ChangeFileName(collectionSet)
Const ForReading = 1
Dim oFile
For Each oFile In collectionSet
Set LineCnt = fso.OpenTextFile(oFile, ForReading)
If oFile.Size = 0 then
'if this msg is not included, weird things happen
MsgBox("The file named " & oFile & _
" is empty.You may want to verify and manually delete it.")
'[I had some code in here to delete the empty file, but nothing worked]
Else
Do While LineCnt.AtEndOfStream <> True
LineCnt.SkipLine
Loop
lineVar = lineCnt.Line-1
strNewFile = strSaveTo & Left(oFile.name, Len(oFile.name)-4) & _
"-" & lineVar & ".txt"
fso.CopyFile oFile, strNewFile
LineCnt.Close
fso.DeleteFile oFile, True
End If
Next
End Sub
答案 0 :(得分:3)
我已经听到轶事证据表明master
集合是&#34; live&#34;,这意味着新创建的文件将被添加到集合中并进行迭代,但我可以&#39;找到任何说明这种或那种方式的文件。无论如何,在处理它们之前,首先将集合中的Files
对象复制到数组中可能是个好主意:
File
答案 1 :(得分:1)
collectionSet
似乎是您尝试修改的文件夹中的文件集合。问题是,每次通过for-each
循环时,您都会将文件添加到此文件夹,其中一些文件会反馈到循环中。您需要做的是找到一种方法来在之前拍摄文件夹的快照,然后尝试迭代它。执行此操作的方法是在迭代之前用文件的名称替换文件夹collectionSet
,然后修改代码以打开文件他们的名字(而不是通过文件对象)。这样,当你迭代它时,这个集合不会扩展。
答案 2 :(得分:1)
FileObject.Name
属性重命名它。以下是一个例子:
Option Explicit 'always declare your vars!
Dim strFolder: strFolder = "c:\temp\Rename Test"
Dim strExtension: strExtension = "txt"
' Call Sub to rename the files in the folder
ChangeFileName strFolder, strExtension
Sub ChangeFileName(strFolder, strExtension)
Const ForReading = 1
Dim FSO: set FSO = CreateObject("Scripting.FileSystemObject")
Dim objFolder: set objFolder = FSO.GetFolder(strFolder)
Dim colFiles: set colFiles = objFolder.Files
Dim objFile
Dim intCount
Dim strFileName
Dim objTextStream
For Each objFile In colFiles
msgbox "File: " & objfile.path & vbcrlf & FSO.GetExtensionName(objFile.path)
if UCase(FSO.GetExtensionName(objFile.Path)) = UCase(strExtension) and _
objFile.Size > 0 then
'set LineCnt = FSO.OpenTextFile(objFile, ForReading)
set objTextStream = objFile.OpenAsTextStream(ForReading,-2)
intCount = 0
strFileName = objFile.Name
Do While objTextStream.AtEndOfStream <> True
intCount = intCount + 1
objTextStream.ReadLine
Loop
objTextStream.Close
objFile.Name = FSO.GetBaseName(objFile.Path) & "-" & _
intCount & "." & FSO.GetExtensionName(objFile.Path)
end if
Next
End Sub