我试着搜索这个,但我的谷歌失败了。我有一个充满文件的目录,这些文件只是它们的GUID:
b3445ffb-55f4-4538-bc6f-13534fd549f6
我知道它们可能只是几个文件扩展名(doc、docx、pdf、jpg),但显然文件扩展名并不存在。我可以编写一个脚本,简单地尝试使用所有已知的文件扩展名打开文件,但效率不是很高。有没有办法读取文件并确定文件应该是什么?
OSX在文件中存储文件类型代码,我希望Windows在文件中存储类似的元数据,文件扩展名只是一个历史文物。我真的这么幸运吗?
注意:您可能想知道为什么我有一个满是GUID的目录,数据库应该跟踪GUID并将其与文件名和扩展名进行匹配,但表被删除了。
发布于 2010-09-09 14:42:42
这些文件头应该出现在该特定类型的每个有效文件中。
JPEG
0xFF
0xD8
0x25
0x50
0x44
0x46
DOC
0xD0
0xCF
0x11
0xE0
0xA1
0xB1
0x1A
0xE1
DOCX
0x50
0x4B
0x03
0x04
为了好玩,我用F#写了一个小应用程序来匹配文件。(一定要喜欢模式匹配!)
module Program =
let main () =
let files =
seq {
for path in System.IO.Directory.GetFiles(directory) do
use fs = System.IO.File.OpenRead(path)
let buffer = Array.zeroCreate 8
let read = fs.Read(buffer, 0, 8)
match buffer with
| [| 0xFFuy; 0xD8uy; _; _; _; _; _; _; |] ->
yield (path, ".jpg")
| [| 0x25uy; 0x50uy; 0x44uy; 0x46uy; _; _; _; _; |] ->
yield (path, ".pdf")
| [| 0x50uy; 0x4Buy; 0x03uy; 0x04uy; _; _; _; _; |] ->
yield (path, ".docx")
| [| 0xD0uy; 0xCFuy; 0x11uy; 0xE0uy; 0xA1uy; 0xB1uy; 0x1Auy; 0xE1uy; |] ->
yield (path, ".doc")
| _ ->
yield (path, ".unk")
}
|> Seq.toArray
System.Console.ReadKey true |> ignore
main()
发布于 2010-09-09 14:38:54
不,Windows不在文件系统中提供此元数据。因为您只需要担心几种类型,所以以编程方式检查文件头并查看要将文件重命名为哪个扩展名并不难。
发布于 2010-09-09 14:40:56
要找出文件中的内容类型,您需要知道您正在查找的内容的签名或“魔术数字”。某些扩展可能不具有此特征。您可以使用such a file signature table创建一个可以识别某些扩展的类。
https://stackoverflow.com/questions/3677593
复制