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
class String
@@mb2wc = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
def to_unicode
len = @@mb2wc.call(65001, 0, self, -1, 0, 0) << 1
buf =" " * len
@@mb2wc.call(65001, 0, self, -1, buf, len)
return buf
end
end
sh_file_operation = Win32API.new('shell32', 'SHFileOperationW', 'P', 'i')
cwd = Dir.getwd.gsub!(/\//, '\\')
src = "#{cwd}\\测试目录\0"
op_struct = [0, 3, src.to_unicode, 0, 4 | 0x10 | 0x0200, 0, 0, 0].pack('iIplSiii')
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 等函数手动去迭代。
检测是否为目录:
find_first_file = Win32API.new('kernel32', 'FindFirstFileW', 'pP', 'i')
cwd = Dir.getwd.gsub!(/\//, '\\')
src = "#{cwd}\\测试目录"
win32_find_data = ' ' * 592
find_first_file.call(src.to_unicode, win32_find_data)
file_attr = win32_find_data.unpack('L')[0]
if 0 != (file_attr & 0x10)
print "`#{src}' 是一个目录"
else
print "`#{src}' 是一个文件"
end
复制代码
作者:
px.凤翔九天
时间:
2010-12-26 14:20
本帖最后由 px.凤翔九天 于 2010-12-26 14:27 编辑
回复
苏小脉
的帖子
恩,好使了啊...谢谢。
话说我问的问题总是你们几个搞定啊....
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1