2009-03-18 9 views

Répondre

0

Tout récemment, j'avais besoin de déterminer le type mime utilisé dans le fichier. Je ne connais pas la logique exacte de ces appels d'API Windows, mais je suppose que cela va dans le fichier pour avoir une idée de son type mime. Espérons que cela aidera

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"; 
      } 
     } 
    } 
} 
+0

Merci Sergej. J'espérais ne pas avoir à rouler le mien, mais ça marchera! Bob – bobuva

+0

Ce n'est pas le vôtre, mais plutôt l'API Windows qui n'est pas encore mappée sur .Net –

0

Si vous pouvez faire confiance à l'extension du fichier, vous pouvez faire quelque chose comme les rails de plugin mimetype-fu.

Ce plugin a une liste yaml d'extensions et leurs types mime connus. C'est assez exhaustif. Nous avons trouvé un analyseur de yaml pour .net et simplement utilisé mametype-fu's yaml. Cela l'a rendu rapide à construire et rapide.

Si vous ne traitez que des flux et que vous n'avez pas de nom de fichier, cela peut fonctionner mieux pour vous.

Questions connexes