当文件中不存在文件时,从文件中检索文件扩展名(在C#中)?

chu*_*nce 1 .net c#

我试着搜索这个,但我的谷歌让我失望了.我有一个充满文件的目录只是他们的GUID:

b3445ffb-55f4-4538-bc6f-13534fd549f6
Run Code Online (Sandbox Code Playgroud)

我知道它们只能是少数文件扩展名(doc,docx,pdf,jpg),但显然文件扩展名不存在.我可以编写一个脚本,只是尝试使用所有已知的文件扩展名打开文件,但这不会非常有效.反正有没有读取文件并确定文件应该是什么?

OSX将文件类型代码存储在文件中,我希望Windows在文件中存储类似的元数据,文件扩展名只是一个历史工件.我很幸运吗?

注意:由于您可能想知道为什么我有一个充满GUID的目录,因此数据库应该跟踪GUID并将其与文件名和扩展名相匹配,但表格已被删除.

Cha*_*ion 10

这些是应该位于该特定类型的每个有效文件上的文件头.

JPEG

0xFF 
0xD8 
Run Code Online (Sandbox Code Playgroud)

PDF

0x25
0x50
0x44
0x46
Run Code Online (Sandbox Code Playgroud)

DOC

0xD0 
0xCF 
0x11 
0xE0 
0xA1 
0xB1 
0x1A 
0xE1
Run Code Online (Sandbox Code Playgroud)

DOCX

0x50 
0x4B 
0x03 
0x04
Run Code Online (Sandbox Code Playgroud)

为了好玩,我在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()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这是任何文件的有效开始,但在这里获得误报的可能性非常低.@ChaosPandion很好的答案. (2认同)