设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2388|回复: 6
打印 上一主题 下一主题

[已经解决] 【求助帖】如何复制目录??

[复制链接]

Lv2.观梦者

铃铃塔的守护者

梦石
0
星屑
626
在线时间
961 小时
注册时间
2010-10-24
帖子
2768

贵宾

跳转到指定楼层
1
发表于 2010-12-19 23:32:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 px.凤翔九天 于 2010-12-20 23:33 编辑

这个问题我搞了好久也没搞定...貌似书上的方法只能复制文件,没找到复制目录及其子目录,文件什么的的方法...求大家帮我找一下或者写一下。谢谢。

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
2
发表于 2010-12-20 00:49:01 | 只看该作者
  1. class String
  2.     @@MultiByteToWideChar = Win32API.new("kernel32", "MultiByteToWideChar", ['I', 'L', 'P', 'I', 'P', 'I'], 'I')
  3.     def to_unicode
  4.         len = @@MultiByteToWideChar.call(65001, 0, self, -1, 0, 0) << 1
  5.         buf =" " * len
  6.         @@MultiByteToWideChar.call(65001, 0, self, -1, buf, len)
  7.         return buf
  8.     end
  9. end

  10. sh_file_operation = Win32API.new('shell32', 'SHFileOperationW', 'P', 'i')

  11. src = "./Data/*\0"
  12. dest = "./NewData\0"

  13. op_struct = [0, 2, src.to_unicode, dest.to_unicode, 4 | 0x10 | 0x0200, 0, 0, 0].pack('iIppSiii')
  14. sh_file_operation.call(op_struct)
复制代码
这里使用的是相对路径,Data 是源目录,NewData 是需要拷贝到的目的目录。

点评

*是通配符,表复制目录下所有文件;后面的是一个空字符,用来分隔多个路径的(SHFileOperation 可以接受以空字符分隔的多个路径,最后以双空字结束)  发表于 2010-12-21 00:04
喵苏大人0.0,这里的\0和*\0是什么用法~求教!  发表于 2010-12-20 22:50

评分

参与人数 1星屑 +800 收起 理由
fux2 + 800 认可答案+脚本费

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

铃铃塔的守护者

梦石
0
星屑
626
在线时间
961 小时
注册时间
2010-10-24
帖子
2768

贵宾

3
 楼主| 发表于 2010-12-20 22:32:26 | 只看该作者
本帖最后由 px.凤翔九天 于 2010-12-20 23:48 编辑

回复 苏小脉 的帖子

额,会用了。但是小问题:用这个复制东东(就比如那个Data目录)复制过去后,里面的文件从RPGXP数据文件变成了rxd文件....不明原因...怀疑复制其他为常用格式文件是否会改动文件?如果会的话,那么都哪些文件会异常啊?(估计不会很多吧...有的话写几个就好,我用这个主要是复制带有图片格式的目录,只要图片和文本文档格式正常就好)

再次经过验证貌似别的都没有问题...

魔法麻将独立游戏制作中,欢迎热情的测试员与UI设计师合作开发~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
4
发表于 2010-12-21 00:00:37 | 只看该作者
回复 px.凤翔九天 的帖子

刚在 XP + NTFS 的环境下测试,确实有各种在 Win7 下没有的诡异现象,之后把路径改成反斜杠和绝对路径就好了,看来还是 XP 的 API 兼容问题。

你这个是因为它把拷贝的目的文件当作 8.3 短文件名来处理了,而 rxdata 这属于长文件名的扩展名,所以它给自动裁剪了。这段脚本明确指定让 SHFileOperation 不显示任何 UI 提示,否则就会有相应的提示。
  1. cwd = Dir.getwd.gsub!(/\//, '\\')
  2. src = "#{cwd}\\Data\\*\0"
  3. dest = "#{cwd}\\NewData\0"
复制代码
这样应该就没问题了。cwd 是当前工作路径,Ruby 返回的是正斜杠,所以需要转换为反斜杠。当然,如果你直接指定一个不带变量的绝对路径的话就不需要这个了。

FAT32 等系统下不知道是不是也有这样的现象,由于缺少环境所以无法测试。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

铃铃塔的守护者

梦石
0
星屑
626
在线时间
961 小时
注册时间
2010-10-24
帖子
2768

贵宾

5
 楼主| 发表于 2010-12-21 00:05:28 | 只看该作者
回复 苏小脉 的帖子

原来如此啊,好,还是改成绝对路径安全,经验证绝对路径的确可行。
弱弱的问一句:表示路径时,xp的正反斜杠不一样吗?记得书上说一样啊...(我记错了?)

魔法麻将独立游戏制作中,欢迎热情的测试员与UI设计师合作开发~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
6
发表于 2010-12-21 03:33:10 | 只看该作者
回复 px.凤翔九天 的帖子

这个不仅和操作系统有关,还和具体处理路径的程序代码有关,也许压根儿就不应该把操作系统作为目录分隔符兼容性的分水岭。
微软支持正斜杠应该始于 DOS 2,之后 NT 的内置 Shell - 命令提示符(cmd.exe),XP 之后的 PowerShell 都能兼容两种斜杠,但这些都仅限于终端 Shell 程序(具体如何兼容取决于 Shell 解释器)。上面代码调用的是 OS 底层的 API,出现了不兼容的问题,说明它处理路径的代码和 Shell 解释器是有出入。虽然这个函数名字里带了一个 SH(Shell 的缩写),但它实际上指的应该是微软的 OS 图形界面(桌面也是一种 Shell,由于提供 GUI,所以又被称为可视化 Shell),而不是命令提示符。

总之,使用反斜杠绝对就肯定兼容,否则就有一定导致不兼容性的风险。

至于必须使用绝对路径,这个是 MSDN 的文档里明确说明了的:"使用相对路径是线程不安全的。"只不过我之前没当回事儿 ><
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

铃铃塔的守护者

梦石
0
星屑
626
在线时间
961 小时
注册时间
2010-10-24
帖子
2768

贵宾

7
 楼主| 发表于 2010-12-21 19:50:56 | 只看该作者
回复 苏小脉 的帖子

这个样子啊,大致了解了(话说你搞这么多专业术语害得我查资料就查了半天 - -||| )
貌似书上写的比较肤浅啊...但是原则就是:能用就好。谢谢你了。
顺便问一句:您是专业的程序员吗?(估计是)话说现在学IT有前景吗?我大学专业轻微迷茫中...

魔法麻将独立游戏制作中,欢迎热情的测试员与UI设计师合作开发~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 19:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表