Project1

标题: 【求助帖】FileTest.directory?不支持中文的解决方案? [打印本页]

作者: px.凤翔九天    时间: 2010-12-23 22:27
标题: 【求助帖】FileTest.directory?不支持中文的解决方案?
本帖最后由 px.凤翔九天 于 2010-12-26 12:11 编辑

发现FileTest.exist?不支持中文后在论坛上找到了紫苏的替换方法:FileTest.exists?  (多了个s,新定义的方法,支持中文)
现在使用删除目录的脚本时发现无法删除文件名为汉字的文件夹....会显示不存在....用FileTest.directory?判定中文文件夹也同样返回万恶的false...表示这样我没招了....
需要的是FileTest.directory?方法支持中文和让删除目录的脚本可以删除中文的目录(子目录)
(经过初步解析那个删除目录的写法貌似也是用了FileTest样式的方法(不完全一样)导致对中文无效。)
删除文件夹的写法的原地址:http://rpg.blue/forum.php?mod=vi ... =%E5%88%A0%E9%99%A4

求高手解答。
作者: 精灵使者    时间: 2010-12-23 22:46
好像已经有好多东西不支持中文了……
作者: 禾西    时间: 2010-12-24 04:08
不支持就轉碼。
conv庫到處都是,我就不提供了……
作者: enghao_lim    时间: 2010-12-24 13:22
楼主,用回你之前Filetest.exists的api转就行了……方式雷同……
作者: px.凤翔九天    时间: 2010-12-25 00:24
回复 enghao_lim 的帖子

表示api什么的是了好久还是不会....于是继续搜索,找到了一下方法...
http://rpg.blue/forum.php?mod=vi ... page%3D1&page=1
拿来试验了一下,返回 argument error string contains null byte...
用其他转码方法(如easyconv)同样如此...
不懂当年zh99998怎么搞好使的....
郁闷。
作者: enghao_lim    时间: 2010-12-25 09:10
回复 px.凤翔九天 的帖子

zh只是open吧,open的话不用那么麻烦,随便就可以了。
话说我稍微测试了一下……名字是没问题了……不过我的rm竟然没权限删除顶目录……纠结中……
作者: 小湖    时间: 2010-12-25 10:44
我觉得 如果自己做游戏的话,游戏文件尽量都做英文吧,比较好管理……
作者: px.凤翔九天    时间: 2010-12-25 11:15
话说这个就不是为游戏设计的....还是汉语更方便啊...
这个是为我爹做个检索程序(rm做的......)时遇到的问题啊....没办法...如果还是找不到方法...额,估计就得去掉备份文件和按创建时间分类管理文件的功能了....唉
ruby的功能有限啊....等我ruby学的差不多,考虑学一下c++什么的吧。
最好是能解决问题...至于不能删除顶目录?是吗。如果不用汉字的话可以,假如用汉字的话的确删不掉(子目录用汉字就删不掉)
继续求解。
作者: px.洛奇亚    时间: 2010-12-26 00:00
此问题无人会吗...不要啊....

作者: 禾西    时间: 2010-12-26 03:54
本帖最后由 禾西 于 2010-12-26 04:07 编辑

發現漢字不是重點= =

:如何創建一個空文檔?
       |Dir.mkdir("路徑")
        路徑的類型一定要是 String,否則就會出錯
        格式需要爲 /.../...的樣子
        
        如果需要在 RM 目錄下建立新的文檔,就需要調用這樣的語句
       |Dir.mkdir('./new_document')
        這裏需要注意的是「.」,這個東西就是指示在自身目錄路徑下建立一個空文檔(子路徑)
        如果沒有「.」
        比如
       |Dir.mkdir('/new_document')
        文檔就不知道會飛到哪里去 Orz。完全找不到了
        雖然存在於某處,不過用 window 的search 功能找不出來
        
        如果同名(主要指同路徑)文檔已經存在,系統會發生錯誤
        Errno::EEXIST異常 File Exist
:如何删除一個文檔?
        删除文檔以前需要確認文檔爲空
        成功的話會返回 0
       |Dir.delete("./new_document") #=> 0
        否則就引起 Errno::ENOTEMPTY異常 File NotEmpty
        
        Ruby 提供了三個功能一樣的方法:
       |Dir.delete("路徑")
       |Dir.rmdir("路徑")
       |Dir.unlink("路徑")
        彼此之間沒有分別,隨便挑選一個用。(.delete 比較好記)

:如何查看一個文檔當中包含的文件?
       |Dir.entries("路徑")
       |Dir.new("路徑").to_a
       |Dir.open("路徑").to_a
       |Dir.open("路徑"){|dir|dir.to_a}
        以上四個方法都是一樣的
        都會返回目錄下所有文件的名字(String 格式),幷整合到一個數組當中
        比如:
       |Dir.open('.') #=>[".","..","Data","Game.exe","Game.ini","Game.rxproj","Audio","Graphics"]

作者: 苏小脉    时间: 2010-12-26 10:25
  1. class String
  2.     @@mb2wc = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  3.     def to_unicode
  4.         len = @@mb2wc.call(65001, 0, self, -1, 0, 0) << 1
  5.         buf =" " * len
  6.         @@mb2wc.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. cwd = Dir.getwd.gsub!(/\//, '\\')
  12. src = "#{cwd}\\测试目录\0"

  13. op_struct = [0, 3, src.to_unicode, 0, 4 | 0x10 | 0x0200, 0, 0, 0].pack('iIplSiii')
  14. sh_file_operation.call(op_struct)
复制代码
“测试目录”是希望删除的目录名,和上次一样,如果是相对于工程根目录才需要前面的 #{cwd}。

Ruby 官方实现有关文件的操作调用的大多数是 POSIX 标准的 I/O 函数,比如 Dir.foreach 就用的是 POSIX 的 opendir 函数,这些函数自然是不支持 UTF-8 的。
作者: px.凤翔九天    时间: 2010-12-26 11:30
本帖最后由 px.凤翔九天 于 2010-12-26 12:05 编辑

回复 苏小脉 的帖子

原来如此啊....万恶的函数....
不管怎么说找到一半答案了,谢谢。
为什么说是一半呢...因为可以删除文件夹了(原理貌似是用空代替原来的文件夹,不是迭代删除)
但是检测是否为目录的问题依旧没搞定......
要是可以的话帮我把那个也搞定了。
(抱怨一句:为什么这个世界上存在那么多编码啊....)
作者: 苏小脉    时间: 2010-12-26 14:15
回复 px.凤翔九天 的帖子

这个删除方法是调用 Windows Shell,递归调用的过程都是 API 内部处理的。理论上当然可以用 DeleteFile 等函数手动去迭代。

检测是否为目录:
  1. find_first_file = Win32API.new('kernel32', 'FindFirstFileW', 'pP', 'i')

  2. cwd = Dir.getwd.gsub!(/\//, '\\')
  3. src = "#{cwd}\\测试目录"

  4. win32_find_data = ' ' * 592
  5. find_first_file.call(src.to_unicode, win32_find_data)
  6. file_attr = win32_find_data.unpack('L')[0]

  7. if 0 != (file_attr & 0x10)
  8.   print "`#{src}' 是一个目录"
  9. else
  10.   print "`#{src}' 是一个文件"
  11. end
复制代码

作者: px.凤翔九天    时间: 2010-12-26 14:20
本帖最后由 px.凤翔九天 于 2010-12-26 14:27 编辑

回复 苏小脉 的帖子

恩,好使了啊...谢谢。
话说我问的问题总是你们几个搞定啊....




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1