Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET框架,相当于Python';s imghdr_C#_Python_.net - Fatal编程技术网

C# .NET框架,相当于Python';s imghdr

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 { ///

Python的
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