1. Giriş
StreamWriter — .NET-də System.IO namespace-inin əsas klasıdır, mətn məlumatlarını fayllara axın vasitəsilə rahat yazmaq üçündür.
Niyə birbaşa FileStream ilə işləmək olmaz?
FileStream yalnız baytlarla işləyir. Əgər ora sətir yazmaq istəsən, mətnin baytlara çevrilməsi və kodlaşdırma barədə özün düşünməlisən (sonra mütləq StreamWriter-a qayıtmaq istəyəcəksən).
StreamWriter isə bu işləri özü həll edir: sən ona sətir verirsən — o, lazım olan baytları fayla yazır.
Əsas üstünlüklər:
- Sətirləri yazmaq asandır, baytlara çevirmə barədə düşünməyə ehtiyac yoxdur.
- Mətnin sətir-sətir yazılması üçün metodlar var.
- Buffer və kodlaşdırmaya nəzarət (bunu da öyrənəcəyik).
Ən sadə nümunə
using System.IO;
string path = "output.txt";
using (StreamWriter writer = new StreamWriter(path))
{
writer.WriteLine("Salam, dünya!");
writer.WriteLine("Bu ikinci sətrdir.");
}
// using-dən çıxanda StreamWriter faylı mütləq azad edir.
Burada nə baş verir?
- Fayl yazmaq üçün açılır (əgər fayl yoxdursa — yaradılacaq).
- Hər sətir faylda ayrıca sətir kimi yazılır (WriteLine metodu).
- using blokundan sonra fayl avtomatik bağlanır, hətta səhv olsa belə.
Əgər output.txt faylını bu proqramdan sonra açsan, orada iki sətir mətn görəcəksən, tam gözlədiyin kimi.
Vacib nüans
Əgər fayl artıq varsa, o tamamilə yenidən yazılacaq! İçində nə varsa — silinəcək. Ona görə ehtiyatlı ol: belə fayllarda vacib dissertasiyanı və ya yeganə kommunal qəbzini saxlamasan yaxşıdır.
2. Məlumatların axına yazılması
StreamWriter-in əsas metodları
| Metod | Təsviri |
|---|---|
|
Sətiri sətirsonu olmadan yazır |
|
Sətiri sətirsonu ilə yazır |
|
Buffer-i məcburi şəkildə fayla yazır (əksər hallarda lazım olmur) |
/ |
Axını bağlayır və resursu azad edir (using bunu edir) |
|
Əsas axına çıxış əldə etmək (məsələn, FileStream) |
Write() metodu
Məlumatı yeni sətrə keçmədən yazır. Sonra nə yazsan, hamısı eyni sətrdə olacaq.
WriteLine() metodu
Məlumatı avtomatik sətirsonu simvolu ilə yazır (\r\n Windows-da, \n Unix-ə bənzər OS-lərdə).
Bu, hər yazıdan sonra Enter basmaq kimidir.
Write() və WriteLine(): fərqin nümayişi
using (var writer = new StreamWriter("example.txt"))
{
writer.Write("Birinci ");
writer.Write("abzas. ");
writer.WriteLine("Sətri bitirdik, Enter!");
writer.Write("İkinci abzas.");
}
İndi example.txt təxminən belə olacaq:
Birinci abzas. Sətri bitirdik, Enter!
İkinci abzas.
3. Kodlaşdırma ilə işləmək
Susmaya görə StreamWriter yaradanda heç bir parametr göstərməsən, UTF-8 BOM ilə (Byte Order Mark) istifadə olunacaq.
Əslində bu rahat və müasir seçimdir, amma bəzən kodlaşdırmanı açıq şəkildə göstərmək lazımdır — məsələn, köhnə proqramlarla uyğunluq və ya import olunan məlumatlar üçün.
Kodlaşdırmanı necə göstərmək olar?
// Faylı Windows-1251 kodlaşdırmasında yazmaq (köhnə sistemlər üçün kiril əlifbası)
using (var writer = new StreamWriter("cyrillic.txt", false, System.Text.Encoding.GetEncoding("windows-1251")))
{
writer.WriteLine("Salam, kiril dünyası!");
}
Vacib məqam:
Kodlaşdırma sistemdə dəstəklənməlidir. Əmin deyilsənsə — UTF-8 istifadə et.
4. Konstruktorun əlavə parametrləri
StreamWriter-in daxili mətbəxinə baxaq:
public StreamWriter(
string path, // faylın yolu
bool append = false, // faylın sonuna əlavə etmək?
Encoding encoding = null, // kodlaşdırma
int bufferSize = 1024 // buffer ölçüsü, bayt
)
- append — əgər false (susmaya görə), fayl tamamilə yenidən yazılacaq. true olsa, yeni yazılar sona əlavə olunacaq.
- encoding — istifadə olunan kodlaşdırma.
- bufferSize — böyük həcmli məlumatlarla işləmək üçün daxili buffer ölçüsü.
Nümunə: eyni fayla əlavə yazmaq
// Fayl yenidən yazılmayacaq, əlavə olunacaq
using (var writer = new StreamWriter("log.txt", append: true))
{
writer.WriteLine(DateTime.Now + " -- Yeni hadisə");
}
5. Faydalı nüanslar
Əlavə yazma və yenidən yazma zamanı nə baş verir
| Rejim | Nə edir? | Faylda nəticə |
|---|---|---|
| append: false | Hər şeyi təmizləyib yenidən yazır | Köhnə məlumatlar silinir |
| append: true | Yeni sətirləri sona əlavə edir | Köhnə sətirlər qalır |
İpucu: Əlavə yazma rejimi (append: true) — log yazmaq üçün əla seçimdir, hadisələrin tarixçəsini saxlamaq lazım olanda.
StreamWriter və böyük həcmli məlumatlar
- StreamWriter yazını buffer-də saxlayır: real məlumatlar fayla bir az gec düşür, WriteLine çağırandan dərhal sonra yox. Amma axın bağlananda (və ya Flush() çağıranda) hər şey diskdə olacaq.
- WriteLine ilə yazmaq sətir-sətir çıxış üçün çox effektivdir. Daha mürəkkəb formatlar üçün (JSON, CSV və ya XML) uyğun kitabxanalardan istifadə et, ya da xüsusi simvolları (məsələn, vergül və ya dırnaq) diqqətlə ekranda göstər.
Yazını düzgün bitirmək və resursları azad etmək
Düzgün yol: həmişə using istifadə et!
Beləliklə, fayl bağlanacaq, hətta istisna olsa belə (məsələn, disk qəfil "bitdi" və ya fayl başqa proqram tərəfindən bloklanıb).
flowchart TD
A[StreamWriter yaradılması] --> B[Faylla işləmək]
B --> C{İstisna?}
C -- Bəli --> D[Dispose çağırılır]
C -- Xeyr --> D
D --> E[Fayl mütləq bağlanır]
6. Praktik nümunələr
Tutaq ki, kurs çərçivəsində bizdə kitabların uçotu üçün mini proqram var. Yeni kitabların fayla yazılması funksionallığını əlavə edək.
Nümunə: Yeni kitabı ayrıca fayla saxlayırıq
using System;
using System.IO;
class Program
{
static void Main()
{
Console.WriteLine("Kitabın adını daxil et:");
string bookTitle = Console.ReadLine();
Console.WriteLine("Müəllifi daxil et:");
string author = Console.ReadLine();
string path = "books.txt";
using (var writer = new StreamWriter(path, append: true))
{
writer.WriteLine($"{bookTitle};{author}");
// CSV formatı: hər sətir — ayrıca kitab, nöqtəli vergül ilə ayrılır
}
Console.WriteLine("Kitab faylda saxlanıldı!");
}
}
Bir neçə kitab əlavə etməyə çalış. books.txt faylında sətirlər əvvəlkiləri silmədən əlavə olunacaq. Bu cür davranış log və ya jurnal üçün əlverişlidir — məsələn, gələcəkdə Enterprise-developer olanda audit sistemin üçün.
7. Fayla yazarkən tipik səhvlərdən necə qaçmaq olar
Əksər yeni başlayanlar belə problemlərlə qarşılaşır:
Fayl bağlanmayıb və başqa proses tərəfindən bloklanıb. Səbəb — using yaddan çıxıb.
Çox sətir yazılıb, amma fayl boş qalıb: Flush() çağırmağı və ya axını bağlamağı unutmusan (amma using ilə bu avtomatik olur).
Fayl təsadüfən yenidən yazılıb, əlavə olunmayıb — append: true göstərməyi unutmusan.
Kodlaşdırma problemi: fayl Notepad-da "qarışıq simvollar" kimi açılır — düzgün kodlaşdırma seçilməyib və ya başqa proqram UTF-8 dəstəkləmir.
UnauthorizedAccessException və ya DirectoryNotFoundException istisnaları: proqram faylı yazmağa icazəsi olmayan yerə və ya mövcud olmayan qovluğa yazmağa çalışır. Yolu və icazələri yoxla.
"file is used by another process" xətası: faylı yazmaq üçün açmısan, amma bağlamamısan, ya da paralel olaraq başqa biri də ora yazmağa çalışır.
GO TO FULL VERSION