2012-06-19 8 views
5

मैं एक फ़ाइल को कई स्थानों पर कॉपी करने का तरीका ढूंढना चाहता हूं साथ ही (सी # के साथ)।एक फ़ाइल को कई स्थानों पर एक साथ कॉपी करने के लिए

का अर्थ है कि मैं नहीं चाहता कि मूल फ़ाइल केवल एक बार पढ़ी जाए, और फ़ाइल को अन्य स्थानों (स्थानीय नेटवर्क पर) "पेस्ट" करने के लिए।

जहाँ तक मेरी परीक्षण मुझे पता चला है,

File.Copy() 

हमेशा स्रोत फिर से पढ़ा जाएगा।

और जहां तक ​​मैं समझता हूं, स्मृति का उपयोग करते समय भी, वह स्मृति टुकड़ा बंद हो जाता है।

इसलिए मूल रूप से, मैं एक "प्रतिलिपि" के रूप में "कॉपी-पेस्ट" की नकल करना चाहता हूं, और बिना हार्ड ड्राइव से दोबारा पढ़ना चाहता हूं।

क्यों? क्योंकि आखिरकार, मुझे कई कंप्यूटरों में एक फ़ोल्डर (1 जीबी से अधिक) की प्रतिलिपि बनाने की आवश्यकता है, और बाधा वह हिस्सा है जिसे मुझे स्रोत फ़ाइल को पढ़ने की आवश्यकता है।

तो, क्या यह हासिल करना भी संभव है?

+2

http://www.java2s.com/Code/CSharp/File-Stream/illustratesuseofMemoryStreams.htm? – Holystream

+1

क्या आपको इसके साथ कोई समस्या है, बस वैज्ञानिक होने या आपके कोड को समय-समय पर अनुकूलित करने के लिए? – ivowiblo

+0

@ivowiblo: मैं एक प्रक्रिया को अनुकूलित करने की कोशिश कर रहा हूं जिसमें 2 घंटे लगते हैं (10 कंप्यूटर के लिए 15 मिनट)। मुझे यकीन है कि "सामान्य" प्रतिलिपि से बेहतर तरीका है। – itsho

उत्तर

9

बल्कि File.Copy उपयोगिता विधि का उपयोग करने से, आप एक FileStream के रूप में स्रोत फ़ाइल को खोलने सकता है, तो के रूप में कई FileStreams को हालांकि कई गंतव्य फ़ाइलों की जरूरत है, स्रोत से पढ़ा खोलें, और प्रत्येक गंतव्य स्ट्रीम में लिखें।

अद्यतन ने समानांतर का उपयोग करके फ़ाइलों को लिखने के लिए इसे बदल दिया। Throughput को सुधारने के लिए।

public static class FileUtil 
{ 
    public static void CopyMultiple(string sourceFilePath, params string[] destinationPaths) 
    { 
     if (string.IsNullOrEmpty(sourceFilePath)) throw new ArgumentException("A source file must be specified.", "sourceFilePath"); 

     if (destinationPaths == null || destinationPaths.Length == 0) throw new ArgumentException("At least one destination file must be specified.", "destinationPaths"); 

     Parallel.ForEach(destinationPaths, new ParallelOptions(), 
         destinationPath => 
          { 
           using (var source = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
           using (var destination = new FileStream(destinationPath, FileMode.Create)) 
           { 
            var buffer = new byte[1024]; 
            int read; 

            while ((read = source.Read(buffer, 0, buffer.Length)) > 0) 
            { 
             destination.Write(buffer, 0, read); 
            } 
           } 

          }); 
    } 
} 

उपयोग:

FileUtil.CopyMultiple(@"C:\sourceFile1.txt", @"C:\destination1\sourcefile1.txt", @"C:\destination2\sourcefile1.txt"); 
+0

शानदार! मैं इसे आज़मा दूंगा, और शायद उत्तर के रूप में चिह्नित होगा। – itsho

+0

मैंने आज इसे आजमाया, लेकिन यह अभी भी धीमा है (1480 फाइलें, कुल 10 एमबी, दो कंप्यूटरों के लिए - मुझे लगभग 4 मिनट लग गए)। कृपया ध्यान दें कि आपका उत्तर डीआईडी ​​केवल एक बार पढ़ने में कामयाब रहा, लेकिन फिर भी, यह समय नहीं छोड़ा। मैं कल इसे प्रोफाइल कर दूंगा, और बेहतर उत्तर के साथ वापस आऊंगा। वैसे भी, मैं समानांतर प्रतिलिपि करने के लिए थ्रेड पर विचार कर रहा हूं ... – itsho

+0

दरअसल, यह केवल एक बार फ़ाइल पढ़ता है, लेकिन स्ट्रीम एक समय में एक फ़ाइल लिखता है। शायद समांतर प्रोग्रामिंग एपीआई इसके साथ मदद कर सकता है। मैं देखूंगा कि क्या मैं इसका उपयोग करने के लिए अपना जवाब दोबारा कर सकता हूं। – HackedByChinese

संबंधित मुद्दे