Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows上是否可以将Ruby temp目录引擎与非英语文件名一起使用?_Ruby - Fatal编程技术网

在Windows上是否可以将Ruby temp目录引擎与非英语文件名一起使用?

在Windows上是否可以将Ruby temp目录引擎与非英语文件名一起使用?,ruby,Ruby,我正在使用“tmpdir”在Ruby中创建一个临时目录,并在临时目录中添加一个非英文文件名的文件: #!/usr/bin/env ruby -KU # coding:utf-8 require 'tmpdir' Dir.mktmpdir { |dir| File.open( "#{dir}/файл.txt", "w" ) {} } 程序清理失败,试图删除“?.txt”。我可以看到正在使用适当的名称创建文件 我在Windows上运行Ruby 1.9。有没有办法解决这个问题,或者Ruby 1.

我正在使用“tmpdir”在Ruby中创建一个临时目录,并在临时目录中添加一个非英文文件名的文件:

#!/usr/bin/env ruby -KU
# coding:utf-8

require 'tmpdir'
Dir.mktmpdir { |dir| File.open( "#{dir}/файл.txt", "w" ) {} }
程序清理失败,试图删除“?.txt”。我可以看到正在使用适当的名称创建文件


我在Windows上运行Ruby 1.9。有没有办法解决这个问题,或者Ruby 1.9不打算在Windows上与非英语字符一起使用?

我很确定这是一个bug。tmpdir方法在自身无法识别utf-8文件名(可能是ruby/windows问题或特定于ruby的问题)后使用清理

以下是一个解决办法:

#!/usr/bin/env ruby -KU
# coding:utf-8

require 'tmpdir'
Dir.mktmpdir do |dir| 
  File.open( "#{dir}/файл.txt", "w" ) {} 
  FileUtils.remove_entry_secure "#{dir}/файл.txt"
end

这将在删除文件夹之前删除“奇数”文件。有点像黑客,但它应该可以工作(测试过)。

这是一个两年多前由打字错误引入的错误。将在Ruby 2.0中修复:(

对于ruby版本<2.0,在
require'tmpdir'
之后定义的这个hack将修复一个问题:

if RUBY_VERSION < '2.0' then
  ##  Fix bug |http://goo.gl/SsAA8|.
  class FileUtils::Entry_
    def entries
      opts = {}
      opts[:encoding] = "UTF-8" if /mswin|mingw/ =~ RUBY_PLATFORM
      Dir.entries(path(), opts)\
          .reject {|n| n == '.' or n == '..' }\
          .map {|n| FileUtils::Entry_.new(prefix(), join(rel(), n.untaint)) }
    end
  end
end
如果RUBY_版本<'2.0',则
##修正错误|http://goo.gl/SsAA8|.
类FileUtils::Entry_
def条目
opts={}
选择[:encoding]=“UTF-8”if/mswin | mingw/=~RUBY_平台
目录项(路径(),选项)\
.拒绝{| n | n=='.'或n=='..'}\
.map{| n | FileUtils::Entry|new(prefix(),join(rel(),n.untaint))}
结束
结束
结束

您可以尝试将
#编码:utf-8
而不是
#编码:utf-8
放在文件的顶部。根据Ruby文档,“编码”和“编码”的工作原理相同。无论如何,我已经检查过了,没有任何变化:(.您的区域设置设置是否正确?请尝试
区域设置gen ru_utf8 ru_ru.UTF-8
。根据Ruby文档,“编码”状态行会覆盖区域设置环境变量。此外,Windows上没有区域设置gen。无论如何,我已使用Windows替代区域设置gen(一个“LANG”环境变量)对此进行了检查。没有任何更改:(.抱歉,但这是胡说八道。控制台和文件系统操作之间绝对没有连接。创建和删除文件与将其名称输出到控制台没有连接。顺便说一句,nix控制台设计为ASCII。是的,这会起作用,但实际上文件名不是我创建的-它们是由第三方代码创建的,例如Subversion命令行客户端。在这种情况下,您需要一种通过系统调用获取真实文件名的方法,如:%x[dir]由于rubys Dir.entries返回了错误编码的“??”版本。感谢
Dir.entries
提示。我搜索了Ruby源代码,发现了一个问题-这确实是多年前由键入错误引起的Ruby bug,可能在Ruby 2.0中得到修复。声誉归你所有:)。