CodeGym /Kurslar /C# SELF /Mətn fayllarının yazılması:

Mətn fayllarının yazılması: StreamWriter

C# SELF
Səviyyə , Dərs
Mövcuddur

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
Write(string)
Sətiri sətirsonu olmadan yazır
WriteLine(string)
Sətiri sətirsonu ilə yazır
Flush()
Buffer-i məcburi şəkildə fayla yazır (əksər hallarda lazım olmur)
Close()
/
Dispose()
Axını bağlayır və resursu azad edir (using bunu edir)
BaseStream
Ə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()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]
Sxem: using hətta səhvlərdə belə faylın bağlanmasına zəmanət verir

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.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION