C# winform - 根据数据而不是扩展名查找文件类型

C# winform - Find file type based on data, not extensions

这就是我的问题 - 我有大量文件都具有相同的文件扩展名(例如 .aabc),但文件类型却大相径庭。有些可能是电子邮件,有些可能是视频。重点是,我不知道这些文件是什么,我需要将它们转换成可用的东西,但要做到这一点,我需要找出它们是什么。

我已经尝试了 Mime-Detective nuget extension 但它不起作用。 “ContentInspectorBuilder”class 没有像 GitHub 上的示例代码那样的检查方法。以下是我为此所做的工作

using System;
using System.IO;
using System.Security;
using System.Windows.Forms;
using MimeDetective;

namespace MimeDetectiveTest
{
    public partial class Form1 : Form
    {
        private OpenFileDialog openFile;
        private ContentInspectorBuilder inspector;
        public Form1()
        {
            InitializeComponent();
            openFile = new OpenFileDialog();
            inspector = new ContentInspectorBuilder()
            {
                Definitions = new MimeDetective.Definitions.ExhaustiveBuilder()
                {
                    UsageType = MimeDetective.Definitions.Licensing.UsageType.PersonalNonCommercial
                }.Build()
            };
        }

        private String findFileType(String path)
        {
            var content = ContentReader.Default.ReadFromFile(path);
            var results = ContentInspectorExtensions.Inspect(inspector, content);
            return results.ByFileExtension().ToString();
        }

        private void openFileButton_Click(object sender, EventArgs e)
        {
            if (openFile.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    var filePath = openFile.FileName;
                    var fileExtension = Path.GetExtension(filePath);
                    var newFileExtension = findFileType(filePath);
                    filePathLabel.Text = filePath;
                    extensionLabel.Visible = true;
                    extensionLabel.Text = "File Identified - " + newFileExtension;
                }
                catch (SecurityException ex)
                {
                    MessageBox.Show($"Security error.\n\nError message: {ex.Message}\n\n" +
                    $"Details:\n\n{ex.StackTrace}");
                }
            }
        }
    }
}

我最接近它的工作方式是使用这个 Github for another Mime-Detective 但是如果我发送特定的文件格式(例如。xml 或 .flac),整个过程都会崩溃或者它什么都不输出(例如.htm)。代码与上面的类似,只是从代码的起始位删除检查器并将 findFileType 方法更改为:

private String findFileType(String path)
    {
        Stream fileDataStream = File.Open(path, FileMode.Open);
        FileType fileType = fileDataStream.GetFileType();
        return fileType.Extension;
    }

我想你错过了一个 Build()

如果比较 github 上的示例代码:

var Inspector = new ContentInspectorBuilder() {
    Definitions = new Definitions.ExhaustiveBuilder() {
        UsageType = Definitions.Licensing.UsageType.PersonalNonCommercial
    }.Build()
}.Build(); // <=====

到您的代码:

inspector = new ContentInspectorBuilder()
{
    Definitions = new MimeDetective.Definitions.ExhaustiveBuilder()
    {
        UsageType = MimeDetective.Definitions.Licensing.UsageType.PersonalNonCommercial
    }.Build()
}; // <=====

您会发现它们是在构建器构建的结果(ContentInspector,而不是ContentInspectorBuilder)上运行,而不是在构建器本身上运行。这也解释了缺少的方法。

实际上,我想知道这条线是怎么来的

var results = ContentInspectorExtensions.Inspect(inspector, content);

没扔。还是做到了?我在 Builder 类型上找不到匹配的扩展。所以,我会预料到一个相关的错误。