6-Amaliy mashg’ulot: Fayl tizimi va oqimlarga doir masala yechish.
FileStream klassi mavhum Stream a'zosini fayllarni
oqimlash uchun mos tarzda
amalga oshirishni ta'minlaydi. Bu elementar oqim bo'lib, faqat bir bayt yoki bayt massivini
yozishi yoki o'qishi mumkin. Biroq, siz kamdan-kam hollarda FileStream tipidagi a'zolar
bilan muloqot qilishingiz kerak bo'ladi. Buning o'rniga, matnli ma'lumotlar yoki .NET
turlari bilan ishlashni osonlashtiradigan oqimlar to’plamidan foydalanasiz. Biroq, tasvirlash
maqsadida, FileStreamning sinxron o'qish/yozish imkoniyatlari bilan tajriba o'tkazish
foydalidir.
FileStream namunasi har qanday faylga ma'lumotlarni o'qish va yozish uchun
ishlatiladi. FileStream namunasini yaratish uchun siz quyidagi ma'lumotlarni
taqdim
etishingiz kerak:
Kirish uchun fayl.
Faylni ochish rejimi. Masalan, siz yangi fayl yaratishni yoki mavjud faylni ochishni
rejalashtiryapsizmi? Agar siz mavjud faylni ochishni rejalashtirmoqchi bo'lsangiz, mavjud
tarkibni qayta yozish kerakmi yoki fayl oxiriga yangi ma'lumotlarni qo'shish kerakmi?
Faylga kirish turi. Misol uchun, sizga o'qish yoki yozish uchun ruxsat kerakmi yoki
ikkalasi ham kerakmi?
Faylga kirish eksklyuziv bo'lishi kerakmi yoki bir vaqtning o'zida boshqa oqimlar
tomonidan kirish imkoniyatini ko'rsatadigan almashish kerakmi. Agar shunday bo'lsa,
boshqa mavzularni o'qish, yozish yoki ikkalasiga ruxsat beriladimi.
Ushbu ma'lumotlarning birinchi qismi odatda kerakli faylga to'liq yo'lni o'z ichiga
olgan qator sifatida taqdim etiladi. Biroq, satrga qo'shimcha ravishda, satr o'rniga Windows
API uslubidagi fayl deskriptorini qabul qiladigan qo'shimcha konstruktorlar mavjud. Qolgan
uchta ma'lumot uchta .NET ro'yxati FileMode, FileAccess va FileShare yordamida taqdim
etiladi. Ushbu ro'yxatlarning ma'nolari jadvalda tasvirlangan:
Hisoblash
Qiymat
FileMode Append, Create, CreateNew, Open, OpenOrCreate,
Truncate
FileAccess Read, ReadWrite,
Write
FileShare Delete, Inheritable, None, Read, ReadWrite, Write
Esda tutingki, FileMode holatida faylning mavjud holatiga mos kelmaydigan rejim
so'ralsa, istisno qilinishi mumkin. Qo'shish, Ochish va Kesish qiymatlari, agar fayl mavjud
bo'lmasa, istisno qiladi va agar u allaqachon mavjud bo'lsa, CreateNew qiymati aksincha.
Create va OpenOrCreate qiymatlari ikkala stsenariyda ham ishlaydi, lekin Yaratish har
qanday mavjud faylni o'chiradi va uni dastlab bo'sh bo'lgan yangisi bilan almashtiradi.
FileAccess va FileShare
raqamlari bit bayroqlaridir, shuning uchun ularning
qiymatlari bit yo'nalishi bo'yicha OR operatsiyasi yordamida birlashtirilishi mumkin; |.
FileStream yaratish uchun ko'p sonli konstruktorlar mavjud.
Eng oddiy uchtasi quyida
tavsiflanganidek ishlaydi:
// O'qish/yozish ruxsati bilan fayl yaratadi va ruxsat beradi
// boshqa mavzular unga o'qish uchun ruxsat oladiFileStream fs = new FileStream(@"С:\C#
Projects\Project.doc", FileMode.Create);
// Avvalgisi bilan bir xil ishlaydi, lekin ruxsat beradi
// boshqa mavzular yozish uchun faylga kirishadiFileStream fs2 = new FileStream(@"С:\C#
Projects\Project2.doc",
FileMode.Create, FileAccess.Write);
// Oldingi konstruktorlar kabi bajaring, lekin
// fs3 ochiq qolsa, boshqa oqimlarga faylga
kirish imkonini beradi
FileStream fs3 = new FileStream(@"С:\C# Projects\Project3.doc",
FileMode.Create, FileAccess.Write, FileShare.None);
Fayllarni o'qish va yozish
FileStream bayt darajasidagi fayllarga kirishni ifodalaydi, shuning uchun, masalan,
matn fayliga bir yoki bir nechta satrlarni o'qish yoki yozish kerak bo'lsa, u holda bayt
massivi maxsus usullar yordamida satrlarga aylantirilishi kerak. Shuning uchun matnli
fayllar bilan ishlash uchun boshqa sinflardan foydalaniladi.
Shu
bilan birga, ma'lum bir tuzilishga ega bo'lgan turli xil ikkilik fayllar bilan ishlashda
FileStream ma'lum ma'lumotlarni ajratib olish va uni qayta ishlash uchun juda foydali
bo'lishi mumkin.
Keling, matnli faylga o'qish-yozish misolini ko'rib chiqaylik:
using System;
using System.IO;
namespace HelloApp
{
class Program
{
static void Main(string[] args)
{
// fayl uchun katalog yarating
string path = @"C:\SomeDir2";
DirectoryInfo dirInfo = new DirectoryInfo(path);
if (!dirInfo.Exists)
{
dirInfo.Create();
}
Console.WriteLine("Faylga yozish uchun satr kiriting:");
string text = Console.ReadLine();
// faylga yozish
using (FileStream fstream = new FileStream($"{path}\note.txt",
FileMode.OpenOrCreate))
{