使用带有文本名中的中文字符的Ruby的递归目录列表
-
08-07-2019 - |
题
我想生成目录中的文件列表。一些文件名包含中文字符。
例如:[<!>#35797; <!>#39564;] .Test.txt
我使用以下代码:
require 'find'
dirs = ["TestDir"]
for dir in dirs
Find.find(dir) do |path|
if FileTest.directory?(path)
else
p path
end
end
end
运行脚本会生成一个文件列表,但中文字符会被转义(替换为反斜杠后跟数字)。使用上面的示例文件名将产生:
<!>QUOT; TESTDIR / [\ 312 \ 324 \ 321 \ 351] Test.txt的QUOT <!>;而不是<!>“; TestDir / [<!>#35797; <!>#39564;] .Test.txt <!>”;。
如何更改脚本以输出中文字符?
解决方案
Ruby需要知道您在代码中处理unicode。使用KCODE设置适当的字符编码,如下所示:
$KCODE = 'utf-8'
我认为utf-8对于汉字来说已经足够了。
其他提示
以下代码更优雅,不需要“查找”。它会在工作目录(或您放入的任何目录)中生成一个文件列表(但不是目录)。
Dir.entries(Dir.pwd).each do |x|
p x.encode('UTF-8') unless FileTest.directory?(x)
end
要获得递归挖掘一个级别的用法:
Dir.glob('*/*').each do |x|
p x.encode('UTF-8') unless FileTest.directory?(x)
end
我确信有一种方法可以让它一直向下,但如果我没记错的话,Dir.glob('**/*')
将会通过整个文件系统。
不隶属于 StackOverflow