2011-01-05 17 views
5

Come trovare l'estensione del file se il file è stato rinominato? C'è qualche strumento disponibile per questo?- Ottieni estensione originale

Esempio: Ho un file "1.doc"; Spero che tutti sappiano che questo è un documento Word che ho appena rinominato come "1.txt". Ma il file è un documento di Word in origine; come posso ottenere l'estensione del file originale?

+0

"Cosa c'è in un nome." L'estensione è solo un nome e non ha molto a che fare con il tipo effettivo di contenuto del file. – user562374

+0

Un altro canidate per [il tag 'confusion-of-ideas'] (http://stackoverflow.com/questions/58640/great-programming-quotes/59001#59001) - cosa c'è in un nome? – delnan

+0

@delnan: Non proprio. Vari formati di file hanno segni caratteristici dopo i quali potrebbero essere riconosciuti (vedi ad esempio formati PNG o GIF). OTOH, Windows usato per (ancora non lo è) riconosce un tipo di file * solo * dall'estensione del file - quindi se si rinomina il file, Windows non ha alcun senso a che fare con esso. – Piskvor

risposta

4

Naturalmente puoi :)

Questo è il codice C# per te. Credo che si può bulid il proprio strumento;)

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

È possibile ottenere i mimetype utilizzando questo codice. Per trovare l'estensione da mime-type basta fare una piccola ricerca su google.

+0

Nice & thanks honibis, l'estrazione di mime-type non è un problema :-) –

+0

Mentre funzionava, non hai ottenuto l'estensione * original *, stai cercando di capire cosa potrebbe * * sono stato.Si noti che questo probabilmente non funzionerà per alcuni tipi di file (come gli archivi ZIP, che hanno le "intestazioni" alla fine del file, in quanto tale, l'inizio del file può contenere qualsiasi cosa). – Piskvor

+0

@Piskvor per file zip restituisce: application/x-zip-compressed, in realtà è più che un'ipotesi poiché l'estensione del file originale è strettamente legata al mimetype – honibis

1

Non è possibile. Dovresti usare uno strumento come file per provare a rilevare il formato del file.

3

Impossibile. Se si utilizza un sistema di tipo * nix, utilizzare il comando file per determinare il formato del file.

Se siete davvero paranoici su cose come questo accada (e rovinare il flusso di lavoro), è possibile fare 2 cose:

  1. fare un hash del file, ad esempio, un MD5 hash in modo da Conosci il tuo file non è stato armeggiato con
  2. prendere atto del timestamp del file in modo da poter vedere quando è stata l'ultima volta che è cambiato
  3. prendere atto della estensione del file in quel timestamp

Questo ti proteggerà in pochi modi:

L'hash si accerterà che il tuo file non sia stato modificato.

Il timestamp ti dirà l'ultima volta che è stato modificato.

L'estensione indicherà la sua estensione originale.

Dal estensione solo la ridenominazione del file non modificherà il suo timestamp, è necessario passaggio 3.

Utilizzando tecniche come questo vi dirà in casi 99,99999999999% che il file è stato modificato da qualcosa o qualcuno.

+1

+1 - 'file' è molto bravo a ** indovinando ** il formato originale, nella maggior parte dei casi. Nota l'enfasi su "indovinare". – Piskvor

Problemi correlati