代码之家  ›  专栏  ›  技术社区  ›  dgo.a

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

  •  1
  • dgo.a  · 技术社区  · 8 年前

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

    2 回复  |  直到 8 年前
        1
  •  1
  •   WPeN2Ic850EU    8 年前

    我想,用天然水晶是不可能的。要确定文件的类型,它需要读取文件的一部分,并根据内容猜测其类型。这可能是一个棘手的部分,因此如果您需要相对可靠的解决方案,我建议调用 file --mime-type -b <file> 从Crystal和解析输出,尽管有时也会出错。

    此外,您还可以使用 crystal-mime 处理输出的碎片 file 命令。

        2
  •  5
  •   Faustino Aguilar Johannes Müller    8 年前

    你可以用 Magic Numbers 检测二进制文件,否则它可能是纯文本文件。

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

    如果假设“binary”是 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!
    

    这甚至适用于不可执行的ELF文件(没有 x 许可)。如果要检测可执行文件,请使用 File.executable? .

    此处演示: https://carc.in/#/r/44a2

    阿尔索 file 是一个很好的命令 libmagic 在引擎盖下检测幻数并获得正确的文件类型。您可以对 LibMagic公司 使用水晶,所以你不需要自己指定所有的魔法数字。