2009-05-06 15 views
12

संपादित करें: मैंने इसे उदाहरण के रूप में दोबारा लिखा है क्योंकि कोड अपेक्षा के अनुसार काम करता है।सी # एमडी 5 हैशर उदाहरण

मैं एक फ़ाइल कॉपी करने की कोशिश कर रहा हूं, एमडी 5 हैश प्राप्त कर रहा हूं, फिर प्रतिलिपि हटाएं। मैं मूल फ़ाइल पर प्रक्रिया ताले से बचने के लिए ऐसा कर रहा हूं, जो एक और ऐप लिखता है। हालांकि, मुझे कॉपी की गई फाइल पर लॉक मिल रहा है।

File.Copy(pathSrc, pathDest, true); 

String md5Result; 
StringBuilder sb = new StringBuilder(); 
MD5 md5Hasher = MD5.Create(); 

using (FileStream fs = File.OpenRead(pathDest)) 
{ 
    foreach(Byte b in md5Hasher.ComputeHash(fs)) 
     sb.Append(b.ToString("x2").ToLower()); 
} 

md5Result = sb.ToString(); 

File.Delete(pathDest); 

मैं तो 'एक File.Delete() पर अपवाद' प्रक्रिया फ़ाइल तक नहीं पहुँच सकते हैं 'हो रही है।

मुझे उम्मीद है कि using कथन के साथ, फाइलस्ट्रीम अच्छी तरह से बंद हो जाएगा। मैंने पढ़ने के बाद using को हटाकर, fs.Close() और fs.Dispose() को हटाकर, फाइलस्ट्रीम को अलग से घोषित करने का भी प्रयास किया है।

इसके बाद, मैंने वास्तव में एमडी 5 गणना की टिप्पणी की, और फ़ाइल को हटाए जाने के साथ कोड उत्तेजित, इसलिए ऐसा लगता है कि यह ComputeHash(fs) के साथ कुछ करना है।

+1

आप क्यों नहीं बस ReadAllBytes (फोन नहीं है) और इसके साथ किया जा सकता है? – BobbyShaftoe

+1

क्योंकि गणना करने के लिए उसकी कॉल स्ट्रीम पर चलती है- यदि फ़ाइल बड़ी है तो उसे इसे स्मृति में रखने की आवश्यकता नहीं होगी। –

+0

क्या आपको इसे हटाने से पहले फ़ाइल को बंद करने की आवश्यकता नहीं है? – JonnyBoats

उत्तर

15

मैंने अपना कोड इसे कंसोल ऐप में रखा और इसे बिना किसी त्रुटि के चलाया, हैश मिला और परीक्षण फ़ाइल निष्पादन के अंत में हटा दी गई है? मैंने बस अपने टेस्ट ऐप से फ़ाइल के रूप में .pdb का उपयोग किया था।

.NET का कौन सा संस्करण आप चल रहे हैं?

मैं उस कोड को डाल रहा हूं जो मेरे पास है जो यहां काम करता है, और यदि आप इसे VS2008 में कंसोल ऐप में डालते हैं .NET 3.5 SP1 यह बिना किसी त्रुटि (मेरे लिए कम से कम) चलाता है।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Cryptography; 
using System.IO; 

namespace lockTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string hash = GetHash("lockTest.pdb"); 

      Console.WriteLine("Hash: {0}", hash); 

      Console.ReadKey(); 
     } 

     public static string GetHash(string pathSrc) 
     { 
      string pathDest = "copy_" + pathSrc; 

      File.Copy(pathSrc, pathDest, true); 

      String md5Result; 
      StringBuilder sb = new StringBuilder(); 
      MD5 md5Hasher = MD5.Create(); 

      using (FileStream fs = File.OpenRead(pathDest)) 
      { 
       foreach (Byte b in md5Hasher.ComputeHash(fs)) 
        sb.Append(b.ToString("x2").ToLower()); 
      } 

      md5Result = sb.ToString(); 

      File.Delete(pathDest); 

      return md5Result; 
     } 
    } 
} 
+0

कोड काम करता है, मैं एक n00b हूँ। मैं MD5hash के बाद फ़ाइल का पुन: उपयोग कर रहा था जो फ़ाइल को लॉक कर रहा था। – mattdwen

+0

क्या बुरा विचार है? मैंने उसे यह समझने में मदद की कि कोड क्यों काम नहीं कर रहा था। इसे लॉक होने से रोकने के लिए एक बड़ी फ़ाइल की प्रतिलिपि बनाना दुनिया का अंत नहीं है। आप वास्तव में क्या कह रहे हैं कि मेरे जवाब में यह गलत है कि उसका कोड वास्तव में काम करता है और इसे चित्रित करने के लिए नमूना बना रहा है? @मिन, क्या आप अधिक संदर्भ दे सकते हैं? –

1

क्या आपने अपनी MD5 ऑब्जेक्ट को किसी भी() में लपेटने का प्रयास किया था? दस्तावेज़ों से, एमडी 5 डिस्पोजेबल है। इससे फ़ाइल को जाने दिया जा सकता है।

+0

हाँ, आप शायद एक फ़ंक्शन को सारण करना चाहते हैं जो फ़ाइल नाम लेता है और हैश स्ट्रिंग देता है। – Mark

-1

क्या आपने फ़ाइल को हटाने से पहले md5Hasher को शून्य करने की कोशिश की है? यह शायद अभी भी फ़ाइलस्ट्रीम (मेमोरी लीक शायद) से जुड़ा हुआ हैडल है।

+2

एक चर को शून्य पर सेट करने पर इसका कोई प्रभाव नहीं पड़ता है कि यह अभी भी स्मृति में है और अभी भी कुछ संसाधनों पर है। कचरा कलेक्टर और इसके फाइनलाइज़र को सेटिंग कोड के बीच लात मारने की अत्यधिक संभावना नहीं होती है जो एक परिवर्तनीय को शून्य पर सेट करता है और उस पर अनुवर्ती कोड की रेखाएं सेट करता है। वास्तव में, संकलक उस रेखा को अच्छी तरह से अनदेखा कर सकता है जो चर को शून्य पर सेट करता है। यह निश्चित रूप से या तो निपटान, कचरा संग्रह या अंतिम रूप से ट्रिगर नहीं करेगा। –

-1

फ़ाइलशेयर.ReadWrite के साथ फ़ाइल क्यों नहीं खोलें?

20

आयात नाम अंतरिक्ष

using System.Security.Cryptography; 

यहाँ समारोह है कि आप MD5 हैश कोड वापस लौटा है। आपको स्ट्रिंग को पैरामीटर के रूप में पास करने की आवश्यकता है।

public static string GetMd5Hash(string input) 
{ 
     MD5 md5Hash = MD5.Create(); 
     // Convert the input string to a byte array and compute the hash. 
     byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input)); 

     // Create a new Stringbuilder to collect the bytes 
     // and create a string. 
     StringBuilder sBuilder = new StringBuilder(); 

     // Loop through each byte of the hashed data 
     // and format each one as a hexadecimal string. 
     for (int i = 0; i < data.Length; i++) 
     { 
      sBuilder.Append(data[i].ToString("x2")); 
     } 

     // Return the hexadecimal string. 
     return sBuilder.ToString(); 
} 
संबंधित मुद्दे