在Crystal中,如何判断文件是文本文件还是二进制文件?

dgo*_*o.a 1 crystal-lang

如果您有2个文件,一个是文本,另一个是二进制文件,是否可以使用Crystal确定哪个文件是文本文件,哪个文件是二进制文件?

Fau*_*lar 5

您可以使用幻数来检测二进制文件,否则它可以是纯文本文件。

使用Crystal是否可以确定哪个是文本文件,哪个是二进制文件?

如果假设“二进制”是ELF文件,则可以尝试以下操作:

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!
Run Code Online (Sandbox Code Playgroud)

即使在不可执行的ELF文件上(x未经许可),该功能也可以使用。如果要检测可执行文件,请使用File.executable?

演示在这里:https : //carc.in/#/r/44a2

file也是一个很好的命令,它libmagic在后台使用来检测幻数并获取正确的文件类型。您还可以对libmagic使用Crystal 进行一些绑定,因此您无需自己指定所有魔术数字。

  • 这里的问题是任何文件都可以模仿。即,您可以编写一个匹配'\ x7FELF'的文件,这使这变得如此困难。 (2认同)