C# .NET框架,相当于Python';s imghdr
Python的C# .NET框架,相当于Python';s imghdr,c#,python,.net,C#,Python,.net,Python的imghdr模块确定文件或字节流中包含的图像类型 在.Net框架中,python的imghdr模块是否有一个等价物 就在最近,我需要确定文件中使用的mime类型。我不知道这个WindowsAPI调用背后的确切逻辑,但我怀疑它会进入文件中,以了解它的mime类型。希望这会有所帮助 using System; using System.IO; using System.Runtime.InteropServices; namespace SomeNamespace { ///
imghdr
模块确定文件或字节流中包含的图像类型
在.Net框架中,python的
imghdr
模块是否有一个等价物 就在最近,我需要确定文件中使用的mime类型。我不知道这个WindowsAPI调用背后的确切逻辑,但我怀疑它会进入文件中,以了解它的mime类型。希望这会有所帮助
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace SomeNamespace
{
/// <summary>
/// This will work only on windows
/// </summary>
public class MimeTypeFinder
{
[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private extern static UInt32 FindMimeFromData(
UInt32 pBC,
[MarshalAs(UnmanagedType.LPStr)] String pwzUrl,
[MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
UInt32 cbSize,
[MarshalAs(UnmanagedType.LPStr)]String pwzMimeProposed,
UInt32 dwMimeFlags,
out UInt32 ppwzMimeOut,
UInt32 dwReserverd
);
public string GetMimeFromFile(string filename)
{
if (!File.Exists(filename))
throw new FileNotFoundException(filename + " not found");
var buffer = new byte[256];
using (var fs = new FileStream(filename, FileMode.Open))
{
if (fs.Length >= 256)
fs.Read(buffer, 0, 256);
else
fs.Read(buffer, 0, (int)fs.Length);
}
try
{
UInt32 mimetype;
FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
var mimeTypePtr = new IntPtr(mimetype);
var mime = Marshal.PtrToStringUni(mimeTypePtr);
Marshal.FreeCoTaskMem(mimeTypePtr);
return mime;
}
catch (Exception)
{
return "unknown/unknown";
}
}
}
}
使用系统;
使用System.IO;
使用System.Runtime.InteropServices;
名称空间名称空间
{
///
///这将只在windows上工作
///
公共类MimeTypeFinder
{
[DllImport(@“urlmon.dll”,CharSet=CharSet.Auto)]
私有外部静态UInt32 FindMimeFromData(
UInt32中国人民银行,
[Marshallas(UnmanagedType.LPStr)]字符串pwzUrl,
[Marshallas(UnmanagedType.LPArray)]字节[]pBuffer,
UInt32 cbSize,
[Marshallas(UnmanagedType.LPStr)]字符串pwzmime,
UInt32 dwMimeFlags,
out UInt32 ppwzMimeOut,
UInt32数据保留
);
公共字符串GetMimeFromFile(字符串文件名)
{
如果(!File.Exists(filename))
抛出新的FileNotFoundException(文件名+“未找到”);
var buffer=新字节[256];
使用(var fs=new FileStream(文件名,FileMode.Open))
{
如果(fs.Length>=256)
fs.Read(缓冲区,0,256);
其他的
fs.Read(缓冲区,0,(int)fs.Length);
}
尝试
{
UInt32模拟型;
FindMimeFromData(0,null,buffer,256,null,0,out-mimetype,0);
var mimeTypePtr=新的IntPtr(mimetype);
var mime=Marshal.PtrToStringUni(mimeTypePtr);
FreeCoTaskMem元帅(mimetypter);
返回mime;
}
捕获(例外)
{
返回“未知/未知”;
}
}
}
}
如果您可以信任文件的扩展名,您可以执行类似rails插件的操作
这个插件有一个yaml扩展列表及其已知的mime类型。它相当详尽。我们为.net找到了一个yaml解析器,并简单地使用了mimetype fu的yaml。这使得它既能快速构建,又能快速执行
如果您只处理流而没有文件名,则上述方法可能更适合您。谢谢Sergej。我希望我不必自己动手,但会成功的!Bob这不是您自己的,而是尚未映射到.Net的Windows API