1. Giriş
Sən FileStream və ya başqa stream sinifləri ilə fayllarla işləyəndə, faylı açmağa cəhd edəndə nə baş verəcəyini əvvəlcədən başa düşmək çox vacibdir. Tez-tez belə olur ki, fayl artıq mövcuddur və sən ya yeni məlumat əlavə etmək istəyirsən, köhnə məlumat itməsin, ya da faylı tamamilə yenidən yazmaq istəyirsən. Digər tərəfdən, bəzən fayl hələ yaradılmayıb və sən onu oxumaq istəyirsən, amma təsadüfən boş fayl yaratmaq riskini istəmirsən.
Məsələn, əgər sən gündəlik qeydlər üçün bir notepad yazırsansa, məqsədin artıq mövcud faylın sonuna yeni qeydlər əlavə etməkdir, əvvəlki yazılanlar itməsin. Bu halda sən faylı əlavə etmə rejimində açmalısan. Başqa bir halda — məsələn, hər dəfə tətbiq işə düşəndə sıfırdan yaradılmalı olan log faylı varsa, köhnə məlumatlar qarışmasın deyə, faylı elə açmaq lazımdır ki, ya təmizlənsin, ya da mövcud deyilsə, yenisi yaradılsın. Əgər məqsədin sadəcə mövcud faylı oxumaqdırsa, çox güman ki, fayl yoxdursa, yeni fayl yaratmamaq istəyəcəksən, yoxsa boş fayl yaranar və bu, istəmədiyin bir şeydir.
Bütün bu müxtəlif hallar — əlavə etmə, yenidən yazma, yaratmadan oxuma — C#-da xüsusi fayl açılış rejimləri ilə həll olunur, bunlar System.IO.FileMode enum-u ilə təyin edilir. Hər rejim fayl açılarkən və ya yaradılarkən davranışı idarə edir və sənə faylla işləyərkən tam nəzarət verir.
2. FileMode enum-u — hamısı barmaq üstündə
Budur FileMode enum-un əsas dəyərləri:
| Dəyər | Təsvir | Fayl varsa davranış | Fayl yoxdursa davranış |
|---|---|---|---|
|
Yeni fayl yaradır. Əgər fayl artıq varsa — exception atır | Xəta | Ok, fayl yaradılır |
|
Yeni fayl yoxdursa yaradır, ya da mövcud olanı yenidən yazır | Yenidən yazır | Ok, yaradır |
|
Mövcud faylı açır. Fayl yoxdursa — exception | Ok, açır | Xəta |
|
Varsa açır, yoxdursa yeni yaradır | Ok, açır | Ok, yaradır |
|
Mövcud faylı açır və uzunluğunu sıfırlayır (məzmun silinir) | Ok, faylı təmizləyir | Xəta |
|
Faylı sona əlavə etmək üçün açır, yoxdursa yeni yaradır | Ok, sona əlavə edir | Ok, yaradır |
İllustrasiya: Davranış ssenariləri
flowchart TD
Start[Başlanğıc]
A{Fayl mövcuddur?}
B1[Sona əlavə et]
B2[Yeni fayl yarat]
B3[Faylı yenidən yaz]
B4[Faylı aç]
B5[Xəta: fayl tapılmadı]
B6[Xəta: fayl artıq mövcuddur]
Start --> A
A --Append, OpenOrCreate--> B1
A --Create, Truncate--> B3
A --Open, Truncate--> B4
A --CreateNew--> B6
A --Create, OpenOrCreate, Append--> B2
A --Open, Truncate--> B5
3. Fərqli rejimlərdə fayl açmaq nümunələri
Gəlin bunları praktikada yoxlayaq — kurs boyu inkişaf etdirdiyimiz mini-applikasiyamızda. Tutaq ki, bizdə salamlar və müraciət tarixi yazdığımız bir mətn faylı var. Üç tipik ssenariyə baxaq:
- A. Yeni fayl yaradırıq (CreateNew)
- B. Faylı yenidən yazırıq (Create)
- C. Faylın sonuna sətir əlavə edirik (Append)
Yeni fayl yaratmaq (FileMode.CreateNew)
Əgər fayl artıq varsa, bu rejim onun yenidən yaradılmasına imkan vermir: proqram IOException atacaq. Bu, məlumat itkisinin və ya başqasının faylının təsadüfən silinməsinin qarşısını almaq üçün uyğundur.
using System;
using System.IO;
string filePath = "greeting.txt";
// Yeni fayl yaratmağa cəhd edirik — əgər artıq varsa, exception olacaq!
try
{
var stream = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write);
var writer = new StreamWriter(stream);
writer.WriteLine("Salam! Bu ilk qeydiyyatdır.");
writer.WriteLine($"Tarix: {DateTime.Now}");
Console.WriteLine("Fayl uğurla yaradıldı.");
writer.Close();
}
catch (IOException)
{
Console.WriteLine($"'{filePath}' faylı artıq mövcuddur! Onu yenidən yazmırıq.");
}
Diqqət et: bu kodu ikinci dəfə işə salsan — catch işləyəcək, məlumatlar silinməyəcək.
Faylı yenidən yazmaq (FileMode.Create)
Bu rejim heç nə ilə hesablaşmır: fayl varsa, tamamilə təmizlənir. Yoxdursa — yeni yaradılır. Hər dəfə "təmiz vərəqdən" başlamaq üçün rahatdır. Məsələn, hesabatı yenidən saxlamaq üçün.
using System;
using System.IO;
string filePath = "greeting.txt";
// Faylı yaratmaq və ya tam yenidən yazmaq
var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write);
var writer = new StreamWriter(stream);
writer.WriteLine("Salam! Faylı tam yenilədim :)");
writer.WriteLine($"Yeniləndi: {DateTime.Now}");
Console.WriteLine("Fayl yaradıldı və ya yenidən yazıldı.");
writer.Close();
Bu kodu bir neçə dəfə işə sal — faylda həmişə yalnız son əlavə olunan sətirlər olacaq. Köhnə hər şey izsiz silinir.
Faylın sonuna əlavə etmək (FileMode.Append)
Loglar, hadisə jurnalları, ziyarət qeydiyyatı və s. üçün əla rejimdir. Fayl yoxdursa — yaradılır. Varsə — məlumatlar sona əlavə olunur.
using System;
using System.IO;
string filePath = "greeting.txt";
// Faylın sonuna yeni sətir əlavə etmək
var stream = new FileStream(filePath, FileMode.Append, FileAccess.Write);
var writer = new StreamWriter(stream);
writer.WriteLine($"Daha bir salam! Tarix: {DateTime.Now}");
Console.WriteLine("Faylın sonuna yeni sətir əlavə olundu.");
writer.Close();
Bu kodu dəfələrlə işə sal. Fayl böyüyəcək, hər yeni qeyd ən sonda olacaq.
4. Fayl açılış rejimini necə seçmək? Praktik məsləhətlər
Real həyatdan ssenarilər:
- Log yazmaq: demək olar ki, həmişə Append istifadə et. Logların yenidən yazılması — admin üçün dərd, pis adam üçün hədiyyədir.
- Hesabat ixracı: çox vaxt Create istifadə olunur, köhnə versiyalarla qovluğu doldurmamaq üçün.
- Məlumat itkisinə həssas yükləmələr: burada CreateNew uyğundur. Fayl varsa — xəta, heç nəyə toxunmuruq.
- Fayl oxumaq: burada ümumiyyətlə yaratma rejimi lazım deyil, FileMode.Open istifadə et — fayl yoxdursa, bu problem siqnalıdır.
C#-da kod yazanda tez-tez File sinifinin statik metodlarından istifadə olunur, onlar içəridə uyğun rejimi özləri seçir. Məsələn, File.AppendAllText həmişə Append ilə işləyir, File.WriteAllText isə Create ilə.
5. Fayl rejimləri və işləyərkən problemlər
Bir az hiyləgər məqamlar:
Əgər sən faylı FileMode.Create və ya FileMode.Truncate ilə açırsansa, bütün məzmun silinəcək. Diqqətli ol — təsadüfi məlumat itkisi təkcə tələbələrin yox, böyük təcrübəli proqramçıların da başına gəlib.
Əgər mövcud olmayan faylı FileMode.Open və ya FileMode.Truncate ilə açmağa çalışsan, FileNotFoundException alacaqsan. Faylın həqiqətən mövcud olduğunu File.Exists(path) ilə yoxlamağı unutma.
Append rejimində yalnız yazmaq olar. Əgər həm oxumaq, həm yazmaq lazımdırsa, başqa rejimlərə bax (OpenOrCreate + uyğun FileAccess).
Nümunə: Oxuma və yazma
Bəzən həm oxumaq, həm də yazmaq istəyirsən (məsələn, bank hesabı açdın — həm pul qoymaq, həm balansı yoxlamaq istəyirsən). FileMode.OpenOrCreate istifadə et:
using System.IO;
string filePath = "balance.txt";
// Faylı oxumaq və yazmaq üçün açırıq; yoxdursa — yaradırıq
var stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
// Burada həm oxumaq, həm yazmaq olar
6. Faydalı nüanslar
Fayl açılış rejimləri
graph TD
A[Fayl soruş] --> B[Rejimi seç]
B --> C1[CreateNew] -->|Fayl varsa| D1[Xəta]
C1 -->|Fayl yoxdursa| E1[Yarat]
B --> C2[Create] -->|Həmişə| F1[Yarat/Yenidən yaz]
B --> C3[Open] -->|Fayl varsa| G1[Aç]
C3 -->|Fayl yoxdursa| D1
B --> C4[OpenOrCreate] -->|Fayl varsa| G1
C4 -->|Fayl yoxdursa| E1
B --> C5[Append] -->|Fayl varsa| H1[Sona əlavə et]
C5 -->|Fayl yoxdursa| E1
B --> C6[Truncate] -->|Fayl varsa| I1[Təmizlə]
C6 -->|Fayl yoxdursa| D1
Fayl açılış rejimləri üzrə cədvəl
| FileMode | Fayl Mövcuddur | Fayl YOXDUR | Məlumatlara çıxış | Köhnə məzmunu silir? |
|---|---|---|---|---|
|
Exception | Yeni yaradır | Yazır | N/A |
|
Yenidən yazır | Yeni yaradır | Yazır | Bəli |
|
Açır | Exception | Oxuyur/yazır | Xeyr |
|
Açır | Yeni yaradır | Oxuyur/yazır | Xeyr |
|
Təmizləyir | Exception | Yazır | Bəli |
|
Sona yazmaq üçün açır | Yeni yaradır | Yalnız yazır | Xeyr (əlavə edir) |
File sinifinin yüksək səviyyəli metodları ilə müqayisə
- File.WriteAllText(path, text) → içəridə FileMode.Create istifadə edir, yəni köhnə fayl yenidən yazılır.
- File.AppendAllText(path, text) → Append rejimi istifadə olunur, hər şey sona əlavə olunur.
- File.ReadAllText(path) → faylı oxumaq üçün açır (FileMode.Open).
Bəzən bu metodlar kifayətdir, amma FileStream və rejimi açıq şəkildə göstərmək tam nəzarət verir.
Fərqli əməliyyat sistemləri üçün xüsusiyyətlər
Proqramçılar tez-tez nəzərə almır ki, Windows-da başqa bir proses tərəfindən yazmaq üçün açılmış fayl təkrar açmaq üçün əlçatan olmaya bilər — giriş cəhdi xətaya səbəb olacaq. Buna görə FileShare parametrindən düzgün istifadə etmək vacibdir, fayla birgə girişə nəzarət etmək üçün (bunun haqqında növbəti dərslərdə danışacağıq). Fərqli əməliyyat sistemlərində bloklama və icazə mexanizmləri fərqli ola bilər, amma fayl açılış rejimlərinin konsepsiyası universaldır.
GO TO FULL VERSION