PDA

View Full Version : تغییر در هر خط فایل متنی



rahimi.mohamad24
شنبه 31 تیر 1391, 19:22 عصر
سلام
من می خوام یه فایل متنی را در حاتی باز کنم که هم بتونم اونو بخونم هم در اون بنویسم.
از کد زیر استفاده کردم ولی وقتی هر خط فایل را می خونم و مثلا میخوام 20 جرف آخر هر خط را پاک کنم، هر خط را 20 حرف آخرش را پاک می کند ولی تغییرات را در یک خط جدید در انتهای فایل درج میکند و خط مورد نظر بدون تغییر باقی می ماند.
مشکل از کجاست؟

if (File.Exists(fileName))
{
FileStream fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
StreamReader sr = new StreamReader(fileStream);

line = sr.ReadLine().Trim();
lengthLine = line.Length;
isInt = int.TryParse(line.Substring(22), out numberOFTransaction);
if (!isInt)
{
numberOFTransaction = -1;
}
isInt = Double.TryParse(line.Substring(12, 10), out amountTransactions);
if (!isInt)
{
amountTransactions = -1;
}

////Continue to read until you reach end of file
using (var streamWriter = new StreamWriter(fileStream,Encoding.Default,))
{
while ((line = sr.ReadLine().Trim()) != null)
{
lengthLine = line.Length;
if (lengthLine > 0)
{

streamWriter.WriteLine(line.Replace(line.Substring (lengthLine -20), "xxxxxxxxxxxxx"));
}
}
}

sr.Close();
}

Saeed_m_Farid
یک شنبه 01 مرداد 1391, 11:48 صبح
سلام
تا اون خطی که کامنت کردین کاری ندارم، چون ربطی به موضوع ندارن (numberOFTransaction و amountTransactions حتماً کاربرد دیگه‌ای دارند)
ولی شما نمی‌تونید با یک FileStream و بدون جابجایی کرسر (محل فعلی عملیات) برای هرکدوم از StreamReader یا StreamWriter این‌کار رو بکنید! طبیعی هست که این اتفاق بیافته، چون کرسرهای Writer و Reader با هم حرکت نمی‌کنند؛ راحت‌ترین راه اینه که یک فایل temp درنظر بگیرید و تغییرات رو اونجا بدین (یعنی خطوطی رو که می‌خواهید تغییر بدین رو عوض کنید و در فایل موقت بنویسید و بقیه رو عین خودش در فایل جدید Writeline کنید) درنهایت فایل قدیمی رو delete کرده و این جدید (temp) رو جایگزین اون کنید؛ مثلاً اگه برای تمام سطرهای فایل اون کار عجیب غریب (تغییر14 تا از 20 کاراکتر آخر به x) رو بخواهین انجام بدین، میشه اینطوری:

if (File.Exists(fileName))
{
//*** numberOFTransaction, amountTransactions و ...
List<string> list = new List<string>();
line = String.Empty;
using (StreamReader reader = new StreamReader(fileName))
while ((line = reader.ReadLine()) != null)
if (line.Length > 20)
list.Add(
line.Replace(
line.Substring(
line.Length - 20),
"xxxxxxxxxxxxx"));
else
list.Add(line);

File.WriteAllLines(fileName + ".tmp", list);
File.Delete(fileName);
File.Move(fileName + ".tmp", fileName);
}


ولی دیگه encoding و try ... catch درست و ... هم باید حواس‌تون باشه! من فقط نمونه گذاشتم.
____________
در صورتیکه حجم فایل خیلی بالاست و شما مثلآً اطلاع دارید (یا می‌تونید به روشی بفهمید) کدوم قسمت‌ها رو باید تغییر بدین، بهتره از روش‌های دیگه که کارآیی بالاتری دارند استفاده کنید، مثل : Memory-Mapped Files (http://msdn.microsoft.com/en-us/library/dd997372.aspx) و یا راحت‌ترش Encoding.ASCII.GetBytes (http://msdn.microsoft.com/en-us/library/ds4kkd55.aspx) و بعد Write در محل موردنظر و ...