Project1
标题:
【求助帖】如何复制目录??
[打印本页]
作者:
px.凤翔九天
时间:
2010-12-19 23:32
标题:
【求助帖】如何复制目录??
本帖最后由 px.凤翔九天 于 2010-12-20 23:33 编辑
这个问题我搞了好久也没搞定...貌似书上的方法只能复制文件,没找到复制目录及其子目录,文件什么的的方法...求大家帮我找一下或者写一下。谢谢。
作者:
苏小脉
时间:
2010-12-20 00:49
class String
@@MultiByteToWideChar = Win32API.new("kernel32", "MultiByteToWideChar", ['I', 'L', 'P', 'I', 'P', 'I'], 'I')
def to_unicode
len = @@MultiByteToWideChar.call(65001, 0, self, -1, 0, 0) << 1
buf =" " * len
@@MultiByteToWideChar.call(65001, 0, self, -1, buf, len)
return buf
end
end
sh_file_operation = Win32API.new('shell32', 'SHFileOperationW', 'P', 'i')
src = "./Data/*\0"
dest = "./NewData\0"
op_struct = [0, 2, src.to_unicode, dest.to_unicode, 4 | 0x10 | 0x0200, 0, 0, 0].pack('iIppSiii')
sh_file_operation.call(op_struct)
复制代码
这里使用的是相对路径,Data 是源目录,NewData 是需要拷贝到的目的目录。
作者:
px.凤翔九天
时间:
2010-12-20 22:32
本帖最后由 px.凤翔九天 于 2010-12-20 23:48 编辑
回复
苏小脉
的帖子
额,会用了。但是小问题:用这个复制东东(就比如那个Data目录)复制过去后,里面的文件从RPGXP数据文件变成了rxd文件....不明原因...怀疑复制其他为常用格式文件是否会改动文件?如果会的话,那么都哪些文件会异常啊?(估计不会很多吧...有的话写几个就好,我用这个主要是复制带有图片格式的目录,只要图片和文本文档格式正常就好)
再次经过验证貌似别的都没有问题...
作者:
苏小脉
时间:
2010-12-21 00:00
回复
px.凤翔九天
的帖子
刚在 XP + NTFS 的环境下测试,确实有各种在 Win7 下没有的诡异现象,之后把路径改成反斜杠和绝对路径就好了,看来还是 XP 的 API 兼容问题。
你这个是因为它把拷贝的目的文件当作 8.3 短文件名来处理了,而 rxdata 这属于长文件名的扩展名,所以它给自动裁剪了。这段脚本明确指定让 SHFileOperation 不显示任何 UI 提示,否则就会有相应的提示。
cwd = Dir.getwd.gsub!(/\//, '\\')
src = "#{cwd}\\Data\\*\0"
dest = "#{cwd}\\NewData\0"
复制代码
这样应该就没问题了。cwd 是当前工作路径,Ruby 返回的是正斜杠,所以需要转换为反斜杠。当然,如果你直接指定一个不带变量的绝对路径的话就不需要这个了。
FAT32 等系统下不知道是不是也有这样的现象,由于缺少环境所以无法测试。
作者:
px.凤翔九天
时间:
2010-12-21 00:05
回复
苏小脉
的帖子
原来如此啊,好,还是改成绝对路径安全,经验证绝对路径的确可行。
弱弱的问一句:表示路径时,xp的正反斜杠不一样吗?记得书上说一样啊...(我记错了?)
作者:
苏小脉
时间:
2010-12-21 03:33
回复
px.凤翔九天
的帖子
这个不仅和操作系统有关,还和具体处理路径的程序代码有关,也许压根儿就不应该把操作系统作为目录分隔符兼容性的分水岭。
微软支持正斜杠应该始于 DOS 2,之后 NT 的内置 Shell - 命令提示符(cmd.exe),XP 之后的 PowerShell 都能兼容两种斜杠,但这些都仅限于终端 Shell 程序(具体如何兼容取决于 Shell 解释器)。上面代码调用的是 OS 底层的 API,出现了不兼容的问题,说明它处理路径的代码和 Shell 解释器是有出入。虽然这个函数名字里带了一个 SH(Shell 的缩写),但它实际上指的应该是微软的 OS 图形界面(桌面也是一种 Shell,由于提供 GUI,所以又被称为可视化 Shell),而不是命令提示符。
总之,使用反斜杠绝对就肯定兼容,否则就有一定导致不兼容性的风险。
至于必须使用绝对路径,这个是 MSDN 的文档里明确说明了的:"使用相对路径是线程不安全的。"只不过我之前没当回事儿 ><
作者:
px.凤翔九天
时间:
2010-12-21 19:50
回复
苏小脉
的帖子
这个样子啊,大致了解了(话说你搞这么多专业术语害得我查资料就查了半天 - -||| )
貌似书上写的比较肤浅啊...但是原则就是:能用就好。谢谢你了。
顺便问一句:您是专业的程序员吗?(估计是)话说现在学IT有前景吗?我大学专业轻微迷茫中...
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1