आप अन्य प्रक्रियाओं एक ही फाइल और अपने प्रक्रिया के लिए लिखने पर विचार करने के लिए नहीं है, तो निर्देशिका, इस से निपटने के लिए होगा सबसे कारगर तरीका करने के लिए अनुमति बनवाने के :
- अस्थायी नाम के साथ नई फ़ाइल बनाना
- नया पाठ लिखने
- अपनी फ़ाइल से पुराने पाठ संलग्न
- हटाना फ़ाइल
- नाम बदलने अस्थायी फ़ाइल
यह अभ्यस्त है कि शांत और तेजी से हो सकता है, लेकिन कम से कम आप दृष्टिकोण आप अब उपयोग कर रहे हैं के लिए स्मृति में एक विशाल स्ट्रिंग आवंटित करने के लिए नहीं होगा।
हालांकि यदि आप सुनिश्चित हैं कि फाइलें छोटे होने जा रही हैं, जैसे कि कई मेगाबाइट्स से भी कम, आपका दृष्टिकोण इतना बुरा नहीं है।
लेकिन आप संभव अपने कोड थोड़ा आसान बनाने में कर सकते हैं:
public static void InsertText(string path, string newText)
{
if (File.Exists(path))
{
string oldText = File.ReadAllText(path);
using (var sw = new StreamWriter(path, false))
{
sw.WriteLine(newText);
sw.WriteLine(oldText);
}
}
else File.WriteAllText(path,newText);
}
और बड़ी फ़ाइलों (यानी> कई एमबी)
public static void InsertLarge(string path, string newText)
{
if(!File.Exists(path))
{
File.WriteAllText(path,newText);
return;
}
var pathDir = Path.GetDirectoryName(path);
var tempPath = Path.Combine(pathDir, Guid.NewGuid().ToString("N"));
using (var stream = new FileStream(tempPath, FileMode.Create,
FileAccess.Write, FileShare.None, 4 * 1024 * 1024))
{
using (var sw = new StreamWriter(stream))
{
sw.WriteLine(newText);
sw.Flush();
using (var old = File.OpenRead(path)) old.CopyTo(sw.BaseStream);
}
}
File.Delete(path);
File.Move(tempPath,path);
}
लिए लेखन फ़ाइल की शुरुआत ओवरराइट होगी जो वहां है। शुरुआत के बजाय फ़ाइल के अंत में डेटा जोड़ने पर विचार करें। – Oded
आपको पूरी फ़ाइल को पढ़ने की आवश्यकता होगी, इसे स्ट्रिंग में स्टोर करें, फिर 'स्ट्रिंग.इंटरर्ट' का उपयोग करके उस स्ट्रिंग की शुरुआत में अपना नया डेटा डालें, फिर संशोधित स्ट्रिंग के साथ पूरी फ़ाइल को फिर से लिखें। –
@ 0 _______ 0 जैसा मैंने किया है। – hamed