PDA

View Full Version : سوال: ویرایش فایل متنی بدون استفاده از فایل کمکی و یا استفاده از buffer



ali.k.m.60
جمعه 15 دی 1391, 10:40 صبح
با سلام آیا راهی وجود داره که یک فایل متنی رو بدون استفاده از کلاسهای جنریک و یا آرایه و یا فایل کمکی ویرایش کنیم ؟

plus
جمعه 15 دی 1391, 14:06 عصر
دقیقا میخواین چکار کنین؟ وسط فایل بنویسید؟

ali.k.m.60
جمعه 15 دی 1391, 16:54 عصر
بلی وسط فایل یک فایل متنی دارم مثل ذیل :
0; ; ;0;False;0
0; ; ;0;False;0
0; ; ;0;False;0
12345;ali;kiani;1;True;2401
12345;mm;kiani;1;False;0
12345;mnnm;kiani;1;False;0
حالا می خوام یک رکورد را ویرایش و یا حذف کنم بدون استفاده از فایل کمکی و یا ریختن در یک لیست از کلاس مربوطه

plus
جمعه 15 دی 1391, 17:10 عصر
خوب شما باید با استفاده از توابع IO، از رکورد بعدی، فایل رو تا آخر بخونید و در یک MemoryStream بنویسید. بعد از اون، اگه میخواین رکورد رو ویرایش کنید، رکورد ویرایش شده رو در فایل (در محل خودش) بنویسید و بعد، MemoryStream رو که شامل رکورد های بعدی هست رو بنویسید.در صورتی که قصد حذف رکورد رو دارین، مرحله نوشتن رکورد ویرایش شده رو ازش بگذرید.در آخر هم اگه با تغیراتیی که دادین طول فایل شما کمتر از قبل شده، باید با استفاده از SetLength مربوط به FileStream، طول فایل رو کاهش بدین تا بایت های اضافی حذف بشه.
البته کلا این روش توصیه نمیشه.

ali.k.m.60
جمعه 15 دی 1391, 17:26 عصر
همونطور که گفتم نباید از buffer استفاده بشه . روشی که تو ذهنمه و نمی تونم پیاده اش کنم :در هنگام خواندن فایل با filestream بگیم position رو به ابتدای همین خط فعلی ببر و حالا با streamwriter درونش بنویسیم .

plus
جمعه 15 دی 1391, 17:37 عصر
همونطور که گفتم نباید از buffer استفاده بشه . روشی که تو ذهنمه و نمی تونم پیاده اش کنم :در هنگام خواندن فایل با filestream بگیم position رو به ابتدای همین خط فعلی ببر و حالا با streamwriter درونش بنویسیم .
من فکر کردم توی عنوان نوشتی با استفاده از buffer.
روشی که میگی تنها در صورتی امکان پذیره که تعداد بایت های مربوط به یک رکورد کم یا زیاد نشه.
البته یک راه هست و اون اینکه قبل از اینکه چیزی تو فایل بنویسی یا تغییری بدی، ابتدا محاسبه کنی که رکوردی که ویرایش میشه چقدر طولش زیاد یا کم میشه و یا اگه رکورد حذف میشه، چقدر فضای خالی ایجاد میکنه.بعد از اون بیای و همه بایت های بعد از اون رکورد رو تک تک (چون بافر نمیخوای استفاده کنی)، و از آخر، به تعداد مورد نیاز به جلو یا عقب شیفت بدی (بسته به اینکه فضا خالی شده یا فضای اضافی مورد نیازه).بعد از شیفت، رکورد مورد نظر رو در همون نقطه ای که هست بنویسی.

ali.k.m.60
جمعه 15 دی 1391, 18:37 عصر
اگه از دوستان کسی نمونه کدی داره ممنون می شم بزاره .