Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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# 使用c检查原始文件类型#_C#_Mime Types - Fatal编程技术网

C# 使用c检查原始文件类型#

C# 使用c检查原始文件类型#,c#,mime-types,C#,Mime Types,我创建了一个程序来检查文件是否有原始扩展名。 例如,File.txt是原始文件,之后它会更改为File.jpeg,然后如何知道原始文件扩展名 我的代码片段是 string filename = openFileDialog1.FileName; string originalFileExt = Path.GetExtension(filename); string type = ScanFileForMimeType(filename); Mess

我创建了一个程序来检查文件是否有原始扩展名。 例如,File.txt是原始文件,之后它会更改为File.jpeg,然后如何知道原始文件扩展名

我的代码片段是

string filename = openFileDialog1.FileName;
        string originalFileExt = Path.GetExtension(filename);
        string type = ScanFileForMimeType(filename);
        MessageBox.Show("Mime type : " + type);

        if (type == "application/octet-stream")
        {
            type = System.Web.MimeMapping.GetMimeMapping(filename);
            MessageBox.Show(type + "");
        }

        RegistryKey key = Registry.ClassesRoot.OpenSubKey(@"MIME\Database\Content Type\" + type, false);
        object value = key != null ? key.GetValue("Extension", null) : null;
        string result = value != null ? value.ToString() : string.Empty;
        MessageBox.Show("File Extension : " + result);

private static string ScanFileForMimeType(string fileName)
    {
        try
        {
            byte[] buffer = new byte[256];
            //using (FileStream fs = new FileStream(fileName, FileMode.Open))
            //{
            //    int readLength = Convert.ToInt32(Math.Min(256, fs.Length));
            //    fs.Read(buffer, 0, readLength);
            //}

            UInt32 mimeType = default(UInt32);
            FindMimeFromData(0, null, buffer, 256, null, 0, ref mimeType, 0);
            IntPtr mimeTypePtr = new IntPtr(mimeType);
            string mime = Marshal.PtrToStringUni(mimeTypePtr);
            Marshal.FreeCoTaskMem(mimeTypePtr);

            if (string.IsNullOrEmpty(mime))
                mime = "application/octet-stream";
            return mime;
        }
        catch (Exception ex)
        {
            return ex.ToString();
        }
    }

但是我没有得到MS Office文件的mime类型,如.docx、.pptx等。

您使用的是系统mime类型,这意味着如果您没有安装处理这些mime类型的应用程序,它们将不会出现……而且,您的缓冲区是空的,您必须用文件的内容填充它。FindMimeFromData无法确定那些Mime类型-例如,一种有趣但不同的方法是检查文件本身。如果您知道可能遇到的文件类型的范围,这可能是有益的。看,我不认为你能找出它是否是一个txt文件,因为txt就是这样:一些数据,并解释为可读文本。它没有页眉、页脚或其他任何内容。我唯一能想象的是,如果你不能确定类型,你应该默认为txt。