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 类型上找不到匹配的扩展。所以,我会预料到一个相关的错误。
这就是我的问题 - 我有大量文件都具有相同的文件扩展名(例如 .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 类型上找不到匹配的扩展。所以,我会预料到一个相关的错误。