2011-01-05 10 views
5

¿Cómo buscar la extensión de archivo si el archivo ha sido renombrado? ¿Hay alguna herramienta disponible para esto?Tipo de archivo - Obtener la extensión original

Ejemplo: Tengo un archivo "1.doc"; Espero que todos sepan que este es un documento de Word que acabo de renombrar como "1.txt". Pero el archivo es un documento de Word originalmente; ¿cómo puedo obtener la extensión de archivo original?

+0

"¿Qué hay en un nombre?" La extensión es solo un nombre y no tiene mucho que ver con el tipo real de contenido del archivo. – user562374

+0

Otro canidate para [la etiqueta 'confusion-of-ideas'] (http://stackoverflow.com/questions/58640/great-programming-quotes/59001#59001) - ¿Qué hay en un nombre? – delnan

+0

@delnan: No realmente. Varios formatos de archivo tienen signos característicos después de los cuales podrían ser reconocidos (ver, por ejemplo, formatos PNG o GIF). OTOH, Windows solía (¿todavía no está seguro?) Reconocer un tipo de archivo * solo * por la extensión del archivo, por lo que si cambia el nombre del archivo, Windows no tiene ni idea de qué hacer con él. – Piskvor

Respuesta

4

Por supuesto que puede :)

Este es el código C# para usted. Creo que se puede tobulid su propia herramienta;)

using System.Runtime.InteropServices; 
using System.IO; 
using Microsoft.Win32; 

    [DllImport(@"urlmon.dll", CharSet = CharSet.Auto)] 
    private extern static System.UInt32 FindMimeFromData(
     System.UInt32 pBC, 
     [MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl, 
     [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer, 
     System.UInt32 cbSize, 
     [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed, 
     System.UInt32 dwMimeFlags, 
     out System.UInt32 ppwzMimeOut, 
     System.UInt32 dwReserverd 
    ); 


    public static string getMimeFromFile(string filename) 
    { 
     if (!File.Exists(filename)) 
      throw new FileNotFoundException(filename + " not found"); 

     byte[] buffer = new byte[256]; 
     using (FileStream fs = new FileStream(filename, FileMode.Open)) 
     { 
      if (fs.Length >= 256) 
       fs.Read(buffer, 0, 256); 
      else 
       fs.Read(buffer, 0, (int)fs.Length); 
     } 
     try 
     { 
      System.UInt32 mimetype; 
      FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0); 
      System.IntPtr mimeTypePtr = new IntPtr(mimetype); 
      string mime = Marshal.PtrToStringUni(mimeTypePtr); 
      Marshal.FreeCoTaskMem(mimeTypePtr); 
      return mime; 
     } 
     catch (Exception e) 
     { 
      return "unknown/unknown"; 
     } 
    } 

Usted obtiene los mimetype utilizando este código. Para encontrar la extensión de mime-type simplemente haz una pequeña búsqueda en Google.

+0

Agradable y gracias a homenajes, la extracción del tipo de mimo no es un problema :-) –

+0

Si bien esto funcionaría, no obtendrás la extensión * original *, estás adivinando lo que * podría * Ha estado.Tenga en cuenta que esto probablemente no funcione para algunos tipos de archivos (como los archivos ZIP, que tienen los "encabezados" al final del archivo, por lo tanto, el inicio del archivo puede contener cualquier cosa). – Piskvor

+0

@Piskvor para archivos zip que devuelve: application/x-zip-compressed, en realidad es más que una suposición, ya que la extensión de archivo original está estrictamente vinculada con mimetype – honibis

1

No puede. Tendría que usar una herramienta como file para tratar de detectar el formato del archivo.

3

Imposible. Si está en un sistema de tipo * nix, use el comando file para determinar el formato de archivo.

Si usted es realmente paranoico sobre cosas como que esto ocurra (y echar a perder su flujo de trabajo), se puede hacer 2 cosas:

  1. construir un hash del archivo, por ejemplo, un MD5 dispersa de tal forma que sé el archivo no ha sido vanamente con
  2. toma nota de la fecha y hora de su archivo para que pueda ver cuándo fue la última vez que cambió
  3. toma nota de la extensión del archivo a esa fecha y hora

Esto lo protegerá de varias maneras:

El hash se asegurará de que su archivo no se haya modificado.

La marca de tiempo le dirá la última vez que se modificó.

La extensión le dirá su extensión original.

Desde extensión simplemente cambiando el nombre del archivo no modificará su marca de tiempo, es necesario el paso 3.

Utilizando técnicas como esto le indicará por 99.99999999999% de los casos de que el archivo ha sido modificado por algo o alguien.

+1

+1 - 'file' es muy bueno para ** adivinar ** el formato original, en la mayoría de los casos. Tenga en cuenta el énfasis en "adivinar". – Piskvor

Cuestiones relacionadas