在 Crystal 中,如何判断文件是文本文件还是二进制文件?
In Crystal, how can you tell if a file is text or binary?
如果您有 2 个文件,一个是文本文件,另一个是二进制文件,是否可以使用 Crystal 来确定哪个是文本文件,哪个是二进制文件?
我想,这是不可能的,使用原生 Crystal。为了确定文件的类型,它需要读取文件的一部分并根据内容猜测其类型。这可能是一个棘手的部分,所以如果你需要一个相对可靠的解决方案,我建议从 Crystal 调用 file --mime-type -b <file>
并解析输出,尽管它有时也会出错。
此外,您可以使用 crystal-mime 分片来处理 file
命令的输出。
您可以使用Magic Numbers 来检测二进制文件,否则它可能是纯文本文件。
is it possible to determine which is a text file and which is a binary using 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?
.
此外,file
是一个很好的命令,它在后台使用 libmagic
来检测幻数并获取正确的文件类型。您也可以使用 Crystal 对 libmagic
进行一些绑定,因此您不需要自己指定所有幻数。
如果您有 2 个文件,一个是文本文件,另一个是二进制文件,是否可以使用 Crystal 来确定哪个是文本文件,哪个是二进制文件?
我想,这是不可能的,使用原生 Crystal。为了确定文件的类型,它需要读取文件的一部分并根据内容猜测其类型。这可能是一个棘手的部分,所以如果你需要一个相对可靠的解决方案,我建议从 Crystal 调用 file --mime-type -b <file>
并解析输出,尽管它有时也会出错。
此外,您可以使用 crystal-mime 分片来处理 file
命令的输出。
您可以使用Magic Numbers 来检测二进制文件,否则它可能是纯文本文件。
is it possible to determine which is a text file and which is a binary using 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?
.
此外,file
是一个很好的命令,它在后台使用 libmagic
来检测幻数并获取正确的文件类型。您也可以使用 Crystal 对 libmagic
进行一些绑定,因此您不需要自己指定所有幻数。