File.exists Ruby становится без учета регистра? - PullRequest
1 голос
/ 29 марта 2020

это действительно странно, когда я использую File.exist? или File.exists? Я обнаружил, что он нечувствителен к регистру?

2.7.0-preview1 :001 > Dir.entries('.')
 => [".", "..", "ppp", "FOO", "Bar"] 
2.7.0-preview1 :002 > File.exist? "foo"
 => true 
2.7.0-preview1 :003 > File.exist? "FOO"
 => true 
2.7.0-preview1 :004 > File.exist? "FOOBAR"
 => false 
2.7.0-preview1 :005 > File.exists? "FOO"
 => true 
2.7.0-preview1 :006 > File.exists? "foo"
 => true 

Как я могу сделать файл.exist чувствительным к регистру? ? Я использую macOS Catalina 10.15.3


Обновление

Для вопроса @Stefan: почему я задаю этот вопрос, это просто я? я практикую фрагмент кода из книги - Ruby Cookbook ver.2, и рецепт состоит в том, чтобы переименовать файлы оптом, как показано ниже:

require 'find'

module Find
  def rename(*paths)
    unrenamable = []
    find(*paths) do |file|
      next unless File.file? file # skip directory
      path, name = File.split(file)
      new_name = yield name

      if new_name && new_name != name
        new_path = File.join(path, new_name)
        if File.exist? new_path
          unrenamable << file
        else
          puts "Renaming #{file} to #{new_path}" if $DEBUG
          File.rename(file, new_path)
        end
      end
    end

    unrenamable
  end

  module_function(:rename)
end

, и первый вариант использования - преобразовать все имена файлов. в нижний регистр

File.rename('./') { |f| f.downcase }

Строка if File.exist? new_path будет иметь значение true, если old_path и new_path просто различаются в верхнем или нижнем регистре, тогда все файлы «не могут быть восстановлены»

Ответы [ 2 ]

4 голосов
/ 29 марта 2020

Как сделать файл.exist с учетом регистра?

Использовать файловую систему с учетом регистра.

2 голосов
/ 29 марта 2020

Это один из способов обхода File.exist? без учета регистра:

def file_exist_case_sensitive(containing_dir, filename)
  Dir[File.join(containing_dir, "*")].select {|f| File.basename(f) == filename}.any?
end

Используйте его следующим образом:

file_exist_case_sensitive('/home/username/Desktop', 'my_file.txt')  #==> true
file_exist_case_sensitive('/home/username/Desktop', 'My_file.txt')  #==> false

Я проверил, что он работает на Ubuntu + ext4 и Windows 10 + NTFS, но вы должны использовать его осторожно, так как он может не работать в некоторых ОС или файловых системах.

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