Можно ли использовать движок временных каталогов Ruby с неанглийскими именами файлов в Windows? - PullRequest
3 голосов
/ 13 февраля 2012

Я создаю временный каталог в Ruby, используя 'tmpdir', и добавляю файл во временный каталог, который имеет неанглийское имя файла:

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

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

Программа не удалась при очистке, пытаясь удалить «????. Txt». Я вижу, что файл создается с соответствующим именем.

Я использую Ruby 1.9 в Windows. Есть ли способ исправить это, или Ruby 1.9 не предназначен для использования с неанглийскими символами в Windows?

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Это ошибка, введенная опечаткой более 2 лет назад. Будет исправлено в Ruby 2.0 :( http://goo.gl/SsAA8

Для ruby ​​версии <2.0 этот хак, определенный после <code>require 'tmpdir', исправит проблему:

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
1 голос
/ 19 февраля 2012

Ну, я уверен, что это ошибка. Метод 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

При этом удаляется «нечетный» файл перед удалением папки. Немного взломать, но оно должно работать (проверено).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...