2011-01-05 9 views
0

Gibt es eine Möglichkeit, die Prüfsumme einer Datei zu berechnen, die nur gelesen wird?Prüfsumme generieren, ohne die Datei zu öffnen

Die einzigen Beispiele, die ich gesehen habe verwendet einen Algorithmus, wie dieser

public string GetChecksum() 
{ 
    FileStream file = new FileStream(_filePath, FileMode.Open); 
    MD5 md5 = new MD5CryptoServiceProvider(); 
    byte[] retVal = md5.ComputeHash(file); 
    file.Close(); 

    StringBuilder sb = new StringBuilder(); 
    foreach (byte t in retVal) 
    { 
     sb.Append(retVal[1].ToString("x2")); 
    } 
    return sb.ToString(); 
} 
+2

Readonly bedeutet nicht, dass Sie es nicht öffnen können. Nicht sicher, was die Frage ist? –

+0

Err ... da Sie nur eine Datei lesen müssen, um eine Prüfsumme nur lesend zu berechnen, ist genau das, was Sie wollen. –

Antwort

5

Sie eine Datei öffnen kann, auch wenn es nur lesbar ist.
Es ist nicht möglich, eine Prüfsumme zu generieren, ohne die Datei zu öffnen, da Sie eine Datei nicht lesen können, ohne sie zu öffnen.

Sie sollten FileAccess.Read übergeben, um es als schreibgeschützt zu öffnen.

Außerdem sollten Sie Prüfsummen mit SHA512, nicht MD5 generieren.

+2

Sehen Sie hier ein Beispiel, warum MD5 nicht für Dateiprüfsummen geeignet ist: http://www.mscs.dal.ca/~selinger/md5collision/ –

+1

Auch sollte er eine 'using'-Klausel für diesen FileStream verwenden, und erwägen, explizit zu sein Verwenden Sie die 'File.OpenRead()' Methode anstelle des 'new FileStream()' Konstruktors. – Cheeso

1

Sie können keine Prüfsumme generieren, ohne die gesamte Datei zu lesen.

Im Allgemeinen können schreibgeschützte Dateien geöffnet werden. Möglicherweise gibt es Datei- oder Ordnerberechtigungen, die verhindern, dass ein bestimmter Benutzer die Datei öffnet.

3

Nach dem documentation öffnet der FileStream-Konstruktor, den Sie verwenden, die Datei für Lesen/Schreiben. Verwenden Sie eine Überladung, die FileAccess.Read angibt.

Der Konstruktor gegeben Lese-/ Zugriff auf die Datei schreiben, und es geöffnet wird teilen Lesezugriff

+1

Insbesondere sollte der Aufruf des Konstruktors 'new FileStream (_filePath, FileMode.Open, FileAccess.Read)' sein. – erickson

0

Nun, nein. Sie müssen eine Datei lesen, um etwas mit dem zu tun, was darin ist. Aber Sie öffnen mit generischem Zugriff, wenn Sie wahrscheinlich möchten FileStream(_filePath,FileAccess.Read,true,4096,true); es schreibgeschützt öffnen. StreamReader wird dies automatisch tun.

Verwandte Themen