В Crystal, как вы можете определить, является ли файл текстовым или двоичным? - PullRequest
0 голосов
/ 22 мая 2018

Если у вас есть 2 файла, один текстовый и другой двоичный, можно ли определить, какой текстовый файл, а какой двоичный, с помощью Crystal?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы можете использовать Магические числа для обнаружения двоичных файлов, в противном случае это может быть простой текстовый файл.

можно ли определить, какой текстовый файл, а какой - двоичный файл, используя Crystal?

Если вы предполагаете, что "двоичный файл" является ELF file, тогда вы можете попробовать это:

def filetype(filename)
  unless File.file?(filename)
    puts "Isn't a file!"
    return
  end
  File.open(filename, "r") do |f|
    case f.gets(4)
    when "\x7FELF" then puts "Is an ELF binary file"
    # when "GIF8" then puts "Is a GIF"
    # when "\x25\x50\x44\x46" then puts "Is a PDF"
    # ... and so on
    else
      puts "Probably is a plain text file"
    end
  end
end

File.write("plain.txt", "Plain Text File")

filetype("plain.txt")   # => Probably is a plain text file
filetype("/usr/bin/ls") # => Is an ELF binary file
filetype("/dev/sda")    # => Isn't a file!

Это работает даже для неисполняемых файлов ELF (без разрешения x).Если вы хотите обнаружить исполняемые файлы, используйте File.executable?.

Демо здесь: https://carc.in/#/r/44a2

Также file - хорошая команда, которая использует libmagic под капотом, чтобы обнаружить магические числа и получить правильный тип файла.Вы также можете сделать некоторые привязки к libmagic, используя Crystal, поэтому вам не нужно указывать все магические числа самостоятельно.

0 голосов
/ 22 мая 2018

Полагаю, это невозможно, используя родной кристалл.Чтобы определить тип файла, ему нужно прочитать часть файла и угадать его тип на основе содержимого.Это может быть непростой задачей, поэтому, если вам нужно относительно надежное решение, я бы предложил вызвать file --mime-type -b <file> из Crystal и проанализировать вывод, хотя иногда он тоже допускает ошибки.

Дополнительно вы можете использовать кристалл-мим осколок для обработки вывода команды file.

...