Вы можете использовать Магические числа для обнаружения двоичных файлов, в противном случае это может быть простой текстовый файл.
можно ли определить, какой текстовый файл, а какой - двоичный файл, используя 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, поэтому вам не нужно указывать все магические числа самостоятельно.