【VBS】文件移动时莫名的文件已存在

柏墨清皓 2018-07-15 11:46:46
写一段VBS,想把某个文件夹下面所有子文件夹的文件加后缀全部移出便于整理,但是总是莫名说文件已存在
代码如下

Function FilesTree(sPath)
'遍历一个文件夹下的所有文件夹文件夹
Set oFso = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFso.GetFolder(sPath)
Set oSubFolders = oFolder.SubFolders

sMoveToPath = oFolder.ParentFolder.Path
sAddName = oFolder.Name
sAddName = "-[" & sAddName & "]"
if oSubFolders.count>0 then
For Each oSubFolder In oSubFolders
FilesTree(oSubFolder)'递归
if oSubFolder.size<50 then
oSubFolder.delete
end if
Next
end if

Set oFiles = oFolder.Files
For Each oFile In oFiles
sNewName = ofile.name
sNewName = mid(sNewName,1,instrrev(sNewName,".")-1) & sAddName & mid(sNewName,instrrev(sNewName,"."))
ofile.name = sNewName
'就是这里有问题
'msgbox sMoveToPath& "\n"& ofile.path'从msgbox看不存在重名
oFso.movefile ofile.path,sMoveToPath
'用这个移动也不行
'ofile.Move(sMoveToPath)
Next
Set oFolder = Nothing

Set oFso = Nothing
End Function

set oSubFolders = CreateObject("Scripting.FileSystemObject").GetFolder(".").SubFolders
For Each oSubFolder In oSubFolders
FilesTree(oSubFolder.path)'递归
Next
Set oSubFolders = Nothing


由于文件数目较多(5000+),大小较大(1GB左右),为了保证速度可能不能用Copy+Delete
求助,拜谢
...全文
399 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2018-07-15
  • 打赏
  • 举报
回复
你的 sMoveToPath变量值不正确吧!

如果sMoveToPath代表一个“目录”,它的值在 oFso.movefile ofile.path,sMoveToPath 这儿, 必须以“\”结尾。
而我看你前面对其赋值的只有这处: sMoveToPath = oFolder.ParentFolder.Path
应该改为: sMoveToPath = oFolder.ParentFolder.Path & "\"
柏墨清皓 2018-07-15
  • 打赏
  • 举报
回复
另外百度过也没有找到合适的解决办法,告诉我用什么关键词搜索也行
舉杯邀明月 2018-07-15
  • 打赏
  • 举报
回复
已经试验出 VBS代码“出错”了。
但相同的情况下,VB6正常执行,VBS会出错。

这个错误感觉很奇怪:
FilesTree (oSubFolder.path) 去“递归”处理、删除了一个空文件夹,
  而在这个“递归”调用返回之后,在VBS中,oSubFolder这个“对象”竟然会失效!
 这个难道是VBS的Bug吗??? 
开始的试验,“最内层”是有文件的,返回后 oSubFolder仍然“正常”,
  但为什么“最内层”是个空文件夹时,返回后oSubFolder会“失效”呢!!! 这根本不合常理的啊!
舉杯邀明月 2018-07-15
  • 打赏
  • 举报
回复
引用 3 楼 weixin_42699010 的回复:
[quote=引用 2 楼 Chen8013 的回复:]
你的 sMoveToPath变量值不正确吧!

如果sMoveToPath代表一个“目录”,它的值在 oFso.movefile ofile.path,sMoveToPath 这儿, 必须以“\”结尾。
而我看你前面对其赋值的只有这处: sMoveToPath = oFolder.ParentFolder.Path
应该改为: sMoveToPath = oFolder.ParentFolder.Path & "\"

非常感谢,已经解决!
另外可以麻烦顺便讲一下删除已经被移空的文件夹那部分代码哪里有缺陷吗?空文件夹套一个空文件夹的时候会报错“oSubFolder不存在”,报错位置是13行[/quote]
你用 oSubFolder.Size < 50来判断“空文件夹”,可靠吗?

会不会有“隐藏的、0字节(或几字节)的文件”呢?
你最好在“计算机”中,直接查看“文件夹属性”确认一下操作失败的目录。
舉杯邀明月 2018-07-15
  • 打赏
  • 举报
回复
我这儿, 按我在2楼说的修正后,VB6和VBS中都是“执行正常”。

柏墨清皓 2018-07-15
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
你的 sMoveToPath变量值不正确吧!

如果sMoveToPath代表一个“目录”,它的值在 oFso.movefile ofile.path,sMoveToPath 这儿, 必须以“\”结尾。
而我看你前面对其赋值的只有这处: sMoveToPath = oFolder.ParentFolder.Path
应该改为: sMoveToPath = oFolder.ParentFolder.Path & "\"

非常感谢,已经解决!
另外可以麻烦顺便讲一下删除已经被移空的文件夹那部分代码哪里有缺陷吗?空文件夹套一个空文件夹的时候会报错“oSubFolder不存在”,报错位置是13行

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧