मैं वहाँ नेट के भीतर कुछ भी स्मृति में बफरिंग के बिना एक फ़ाइल के एक हिस्से को कॉपी अनुमति देने के लिए है विश्वास नहीं है। हालांकि, यह मुझे मारता है कि यह वैसे भी अक्षम है, क्योंकि इसे इनपुट फ़ाइल खोलने और कई बार तलाशने की आवश्यकता है। आप सिर्फ फ़ाइल विभाजित कर रहे हैं, क्यों नहीं इनपुट फ़ाइल एक बार खोलने के लिए, और फिर बस की तरह कुछ लिखें:
public static void CopySection(Stream input, string targetFile, int length)
{
byte[] buffer = new byte[8192];
using (Stream output = File.OpenWrite(targetFile))
{
int bytesRead = 1;
// This will finish silently if we couldn't read "length" bytes.
// An alternative would be to throw an exception
while (length > 0 && bytesRead > 0)
{
bytesRead = input.Read(buffer, 0, Math.Min(length, buffer.Length));
output.Write(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
यह प्रत्येक मंगलाचरण पर एक बफर बनाने में एक छोटी सी अक्षमता है - आप चाहते हो सकता है एक बार बफर बना सकते हैं और पारित उस विधि में भी करने के लिए:
public static void CopySection(Stream input, string targetFile,
int length, byte[] buffer)
{
using (Stream output = File.OpenWrite(targetFile))
{
int bytesRead = 1;
// This will finish silently if we couldn't read "length" bytes.
// An alternative would be to throw an exception
while (length > 0 && bytesRead > 0)
{
bytesRead = input.Read(buffer, 0, Math.Min(length, buffer.Length));
output.Write(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
ध्यान दें कि यह भी (कथन का उपयोग के कारण) उत्पादन धारा बंद कर देता है जो अपने मूल कोड नहीं किया।
महत्वपूर्ण बात यह है कि यह ऑपरेटिंग सिस्टम फ़ाइल को अधिक कुशलतापूर्वक बफरिंग का उपयोग करेगा, क्योंकि शुरुआत में फ़ाइल को फिर से खोलने और फिर मांगने के बजाय आप उसी इनपुट स्ट्रीम का पुन: उपयोग करते हैं।
मुझे लगता है कि यह काफी तेजी हो जाएगा, लेकिन स्पष्ट रूप से आप इसे देखने की कोशिश करनी होगी ...
यह सन्निहित हिस्सा मान लिया गया है, निश्चित रूप से। यदि आपको फ़ाइल के बिट्स को छोड़ना है, तो आप इसे विधि के बाहर से कर सकते हैं। साथ ही, यदि आप बहुत छोटी फाइलें लिख रहे हैं, तो आप उस स्थिति के लिए अनुकूलित भी कर सकते हैं - ऐसा करने का सबसे आसान तरीका शायद इनपुट स्ट्रीम को BufferedStream
पेश करना होगा।
File.OpenRead और File.OpenWrite 100,000 धीमी गति से ठीक हो जाएगा ... –
आप पूरी तरह से फ़ाइल बंटवारे रहे हैं, यानी तुम सिर्फ सभी छोटे में शामिल होने से बड़ी फाइल के पुनर्निर्माण सकता है एक साथ फाइलें? यदि ऐसा है तो वहां बचत होगी। यदि नहीं, तो छोटी फ़ाइलों की श्रेणियां ओवरलैप करें? क्या वे ऑफसेट के क्रम में क्रमबद्ध हैं? – jamie