FAYLDAN O'QISH VA FAYLGA YOZISH. Filestream
FileStream sinfi fayldan o'qish va va faylga yozish imkoniyatini beradi. Bu ikkala, ya`ni matnli va ikkilik fayllar bilan ishlashga imkon beradi.
FileStreamni yaratish
FileStream ob'ektini yaratish uchun ushbu sinfning konstruktorlaridan ham, File sinfining statik metodlaridan ham foydalanishingiz mumkin. FileStream konstruktorida juda ko'p qayta yuklangan versiyalar mavjud, ulardan faqat bittasini, eng sodda va eng ko'p ishlatilish mumkin:
FileStream(string filename, FileMode mode)
bunda konstruktorga ikkita parametr uzatiladi: fayl yo'li va FileMode rejimi. Ushbu rejim faylga kirish rejimini ko'rsatadi va quyidagi qiymatlarni olishi mumkin:
Append: agar fayl mavjud bo'lsa, unda matn fayl oxiriga qo'shiladi. Agar fayl mavjud bo'lmasa, u holda u yaratilgan. Fayl faqat yozish uchun ochiladi.
Create: yangi faylni yaratadi. Agar bunday fayl allaqachon mavjud bo'lsa, u qayta yoziladi.
CreateNew: yangi fayl yaratadi. Agar bunday fayl mavjud bo'lsa, unda dastur xatoni chiqaradi.
Open: faylni ochadi. Agar fayl mavjud bo'lmasa, istisno qilinadi
OpenOrCreate: agar fayl mavjud bo'lsa, u ochiladi, agar bo'lmasa, yangisi yaratiladi
Truncate: agar fayl mavjud bo'lsa, u qayta yoziladi. Fayl faqat yozish uchun ochiladi.
FileStream ob'ektini yaratishning yana bir usuli File sinfining statik metodlari bilan ifodalanadi:
FileStream File.Open(string file, FileMode mode);
FileStream File.OpenRead(string file);
FileStream File.OpenWrite(string file);
Birinchi usul FileMode ob'ekti asosida faylni ochadi va FileStream fayl oqimini qaytaradi. Ushbu usul shuningdek, bir nechta qayta yuklanuvchi versiyalarga ega. Ikkinchi usul oqimni o'qish uchun, uchinchi usul esa oqimni yozish uchun ochadi.
FileStream metodi va xossalari
FileStream sinfining eng muhim xossalari va usulllarini ko`rib chiqamiz:
Length xossasi: oqim uzunligini baytlarda qaytaradi
Position xossasi: oqimdagi joriy holatni qaytaradi
void CopyTo(Stream destination): ma'lumotlarni joriy oqimdan destination oqimiga nusxalash
Task CopyToAsync(Stream destination): CopyToAsync metodining asenxron versiyasi
int Read(byte[] array, int offset, int count): fayldan baytlar massiviga ma'lumotlarni o'qiydi va muvaffaqiyatli o'qilgan baytlarning sonini qaytaradi. U uchta parametrdan iborat:
array - fayldan o'qilgan ma'lumotlar joylashtirilgan baytlar massivi
ofset - o'qilgan baytlar joylashtiriladigan array massivida baytlarda bo'lgan ofsetni (siljishni) bildiradi
count - o'qish uchun baytlarning maksimal soni. Agar faylda soni kamroq bayt bo'lsa, ularning barchasi o'qiladi
Task ReadAsync(byte[] array, int offset, int count): Read metodining asinxron versiyasi
long Seek(long offset, SeekOrigin origin): oqimdagi o'rnini(pozitsiyani) ofset parametrida baytlar soni bo'yicha siljish bilan o'rnatadi.
void Write(byte[] array, int offset, int count): ma'lumotlarni baytlar masstvidan faylga yozadi. U uchta parametrdan iborat:
array - ma'lumotlar faylga yoziladigan baytlar massivi
offset -oqimga yozish boshlanadigan joydan array massivida baytlarda siljish
count - yozish uchun baytlarning maksimal soni.
ValueTask WriteAsync(byte[] array, int offset, int count): Write metodining asinxron metodi
Fayldan o'qish va faylga yozish
FileStream bayt darajasidagi fayllarga kirishni anglatadi, shuning uchun, masalan, agar matnli faylga bir yoki bir nechta satrlarni o'qish yoki yozish kerak bo'lsa, u holda baytlar massivi maxsus metodlar yordamida satrlarga aylantirilishi kerak. Shuning uchun, matnli fayllar bilan ishlash uchun boshqa sinflar ishlatiladi.
Shu bilan birga, ma'lum bir strukturaga ega bo'lgan har xil ikkilik fayllar bilan ishlashda, FileStream ma'lum bir qismlarni olish va uni qayta ishlash uchun juda foydali bo'lishi mumkin.
Matn fayliga o'qish-yozish misolini ko'rib chiqaylik:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace fayllar_bilan_ishlash
{
class Program
{
static void Main(string[] args){
// fayl uchun katalog yaratamiz
string path = "D:\\SomeDir2";
DirectoryInfo dirInfo = new DirectoryInfo(path);
if (!dirInfo.Exists)
{
dirInfo.Create();
}
Console.WriteLine("Yozish uchun fayl nomini kiriting:");
string text = Console.ReadLine();
Console.WriteLine(@path + "\\note.txt");
// faylga yozish
using (FileStream fstream = new FileStream(@path + "\\note.txt", FileMode.OpenOrCreate))
{
// satrni baytlarga aylantiramiz
byte[] array = System.Text.Encoding.Default.GetBytes(text);
// baytlar massivini faylga yozish
fstream.Write(array, 0, array.Length);
Console.WriteLine("Tekst faylga yozildi");
}
// fayldan o’qish
using (FileStream fstream = File.OpenRead(@path+"\\note.txt"))
{
// satrni baytlarga aylantirish
byte[] array = new byte[fstream.Length];
// ma’lumotlari o’qish
fstream.Read(array, 0, array.Length);
// satrga aylanirish
string textFromFile = System.Text.Encoding.Default.GetString(array);
Console.WriteLine("Fayldagi matn:"+textFromFile);
}
Console.ReadKey();
}
}
}
Keling, ushbu misolni ko'rib chiqaylik. Birinchidan, fayl uchun papka yaratiladi. Bundan tashqari, operatsion tizim darajasida ma'lum kataloglarga yozishni cheklashlar o'rnatilishi mumkin va biz bunday kataloglarda faylni yaratishga va yozishga harakat qilganda xato haqida xabar chiqadi. Ko`pchilik adabiyotlarda ikkita slesh o`rniga bir slesh ishlatiladi. bu erda agarda bir slesh ishlatilsa \n yangi qatorga tushush uchrashi mumkinligini inobatga olish zarur. shuningdek ko`rsatilgan yo`lga murojat qilish mumkinligi ham katta ahamiyatga ega. O'qishda ham, yozayotganda ham using operatori ishlatilgan. Ushbu operatorni fayli kodning boshida using nomlar fazosini bog'laydigan direktiva bilan aralashtirib yubormang. using operatori kod blokida ob'ektni yaratishga imkon beradi, oxirida ushbu ob'ektning "Dispose" metodi chaqiriladi va shu tariqa ob'ekt o`chiriladi. Bunday holda, ob'ekt sifatida fstream o'zgaruvchisi ishlatiladi.
Yozish va o'qish paytida System.Text nomlar fazosidan Encoding.Default kodlash ob'ekti foydalanadi. Bu holda biz ikkita metoddan foydalanamiz: baytlar massividan bayt olish uchun GetBytes va bayt qatoridan satr olish uchun GetString.
Natijada, kiritilgan satr note.txt fayliga yoziladi. Aslida, bu ikkilik fayl (matnli fayl emas), garchi biz unga bitta satr yozsak ham, uni matn tahrirlovchisida ochib o'qiladigan shaklda ko'rishimiz mumkin. Ammo, agar biz unga tasodifiy baytni yozsak, masalan:
fstream.WriteByte(13);
fstream.WriteByte(103)
Ushbu holda uni tushunishda muammolarga duch kelamiz. Shuning uchun ham to'g'ridan-to'g'ri matnli fayllar bilan ishlash uchun mo'ljallangan StreamReader va StreamWriter sinflari qo`llaniladi.
Ushbu oddiy konsol dasturi, ammo haqiqiy dasturlarda FileStream usullarining asenxron versiyalaridan foydalanish tavsiya etiladi, chunki fayl operatsiyalari uzoq vaqt talab qilishi va dasturda qiyinchiliklar bo'lishi mumkin.
Dostları ilə paylaş: |