1. File sinfi: sadəlik və effektivlik
System.IO.File sinfi "bir əməliyyat — bir metod" konsepsiyasını həyata keçirir. O, OS ilə mürəkkəb qarşılıqlı əlaqəni gizlədən yüksək səviyyəli metodlar dəstini təqdim edir, sən isə sadəcə öz tapşırığına fokuslana bilirsən.
File sinfi konkret olaraq nə bacarır?
- Mətn və ya istənilən binar məlumatları fayla yazmaq.
- Faylın məzmununu oxumaq tam şəkildə və ya sətr-sətr (mətn faylları üçün).
- Mövcud faylları kopyalamaq, silmək və adını dəyişmək.
- Faylın mövcudluğunu yoxlamaq göstərilən yolda.
- Fayl atributları ilə işləmək (məsələn, yaradılma tarixi, ölçü – əlavə siniflər vasitəsilə).
Niyə bu rahatdır?
Bütün File metodları statikdir. Yəni istifadə etmək üçün obyekt yaratmağa ehtiyac yoxdur, sadəcə lazım olan metodu çağırırsan, məsələn:
File.WriteAllText("data.txt", "Salam, fayl!");
Bu stil Console sinfi ilə işləməyə çox bənzəyir: hər şey sadə və başadüşüləndir, heç nə "yaratmağa" ehtiyac yoxdur, axınlar barədə düşünməyə də ehtiyac yoxdur.
Əgər sən fayllarla işləmək üçün universal və rahat alət axtarırsansa, System.IO.File sinfi məhz budur. O, faylları oxumaq, yazmaq, kopyalamaq, silmək və digər əsas əməliyyatlar üçün bir çox metod təklif edir, sanki fayl sistemi üçün İsveçrə bıçağıdır.
File necə istifadə olunur?
Bütün File sinfinin metodları statikdir, yəni istifadə etmək üçün obyekt yaratmağa ehtiyac yoxdur — sadəcə File.Nə isə() yazırsan. Bu, Console.WriteLine() kimi çağırışlara çox bənzəyir, sadəcə indi fayllar üçün.
string text = "Salam, dünya!";
string path = "hello.txt";
// Mətnin fayla yazılması (əgər fayl var idisə, üstündən yazacaq!)
File.WriteAllText(path, text);
// Bütün faylın bir sətr kimi oxunması
string readText = File.ReadAllText(path);
Console.WriteLine("Faylın məzmunu: " + readText);
Lifehack: Əgər sən 10 dəfə ardıcıl ReadAllText və WriteAllText yazırsansa, yəqin ki, nəsə səhv edirsən — bu metodlar sadə ssenarilər və kiçik fayllar üçün yaxşıdır.
File sinfinin tez-tez istifadə olunan metodları
| Metod | Təsviri |
|---|---|
|
Göstərilən yolda faylın olub-olmadığını yoxlayır |
|
Faylı silir |
|
Faylı kopyalayır |
|
Faylı köçürür (və ya adını dəyişir) |
|
Bütün faylı bir sətr kimi oxuyur |
|
Sətri fayla yazır (əgər fayl varsa, üstündən yazır) |
|
Fayldakı bütün sətirləri sətr massivinə oxuyur |
|
Sətr massivini fayla yazır (hər sətr ayrıca sətr kimi) |
|
Fayldakı bütün baytları bayt massivinə oxuyur |
|
Bayt massivini fayla yazır |
2. Mətn fayllarının yazılması və oxunması
Gəlin File sinfinin ən çox istifadə olunan metodlarını praktiki nümunələrlə nəzərdən keçirək. Onlarla işləmək üçün kod faylının əvvəlində using System.IO; direktivi mütləq lazımdır.
using System;
using System.IO; // File sinfi ilə işləmək üçün mütləqdir
using System.Linq; // ReadLines üçün lazım ola bilər
Faylın tam oxunması
Bu ən çox rast gəlinən tapşırıqlardan biridir: mətn məlumatlarını fayla saxlamaq və ya onları geri yükləmək.
Bir sətrin (və ya bütün mətnin) fayla yazılması: File.WriteAllText() Bu metod göstərilən yolda yeni fayl yaradır. Əgər bu adda fayl artıq varsa, onun məzmunu tamamilə yeni mətnlə əvəz olunacaq.
string myFilePath = "notes.txt";
string textContent = "Bu gün C# öyrənmək üçün əla gündür.\nEv tapşırığını etməyi unutma.";
// Bütün mətni fayla yazırıq
File.WriteAllText(myFilePath, textContent);
Console.WriteLine($"'{myFilePath}' faylı uğurla yaradıldı/üstündən yazıldı.");
Faylın tam bir sətr kimi oxunması: File.ReadAllText() Bu metod mətn faylının bütün məzmununu başdan sona oxuyur və onu bir böyük sətr kimi qaytarır.
string myFilePath = "notes.txt";
// Vacib: oxumadan əvvəl həmişə faylın mövcudluğunu yoxla ki, səhv olmasın!
if (File.Exists(myFilePath))
{
string content = File.ReadAllText(myFilePath);
Console.WriteLine($"'{myFilePath}' faylının məzmunu:\n{content}");
}
else
{
Console.WriteLine($"Xəta: '{myFilePath}' faylı oxumaq üçün tapılmadı.");
}
Vacib qeyd: File.WriteAllText() və File.ReadAllText() metodları kiçik və orta ölçülü fayllar üçün əladır (məsələn, mətn qeydləri, konfiqurasiya faylları, qısa loglar). Amma əgər fayl çox böyükdürsə (deyək ki, onlarla və ya yüzlərlə MB, bəlkə də GB-larla), bütün məzmunu bir sətr kimi RAM-a yükləmək çoxlu yaddaş sərf edə bilər və hətta OutOfMemoryException verə bilər. Belə hallar üçün daha effektiv yanaşmalar var (aşağıda və növbəti mühazirələrdə danışılacaq).
3. Faylın sətr-sətr oxunması
Əgər sən böyük mətn faylları ilə işləyirsənsə, məsələn, böyük CSV hesabatları, uzun log faylları və ya mətn bazaları, onları tam şəkildə RAM-a yükləmək (yəni bütün faylı bir anda diskdən RAM-a çəkmək) səmərəsiz və ya mümkün olmaya bilər. Burada File.ReadLines() köməyə gəlir.
File.ReadLines(path) — bu metod bütün faylı dərhal yükləmir. Əvəzində o, sənə xüsusi kolleksiya (IEnumerable<string>) qaytarır, hansı ki, sən faylı sətr-sətr oxuya bilirsən, nə vaxt lazımdırsa. Buna "tənbəl oxuma" və ya "axınla oxuma" deyilir.
string logFilePath = "application.log";
string text = """
INFO: Tətbiq işə salındı.
WARN: X modulunda problem aşkarlandı.
ERROR: Şəbəkə üzrə kritik xəta.
INFO: Tətbiq dayandırıldı.
""";
// Tutaq ki, bizdə çoxlu sətrli log faylı var.
File.WriteAllText(logFilePath, text);
// Hər dövrədə yalnız BİR sətr oxunur və işlənir
foreach (string line in File.ReadLines(logFilePath))
Console.WriteLine($"- {line}");
Üstünlük: Fayl hissə-hissə oxunur və işlənir, bu da böyük fayllarla işləyərkən yaddaş sərfiyyatını xeyli azaldır.
File.ReadLines() və File.ReadAllLines() arasındakı fərq:
- File.ReadAllLines(path): Bütün fayl sətirlərini dərhal RAM-a yükləyir və onları string[] massiv kimi qaytarır. Bu metodu çağırdıqdan sonra bütün fayl artıq yaddaşdadır. Əgər sənə bütün sətirlərə eyni anda tam çıxış lazımdırsa (məsələn, çeşidləmə və ya axtarış üçün), bu rahatdır.
- File.ReadLines(path): IEnumerable<string> qaytarır, hansı ki, fayl sətirlərini bir-bir oxumağa imkan verir. Fayl yalnız növbəti sətri istədikdə (məsələn, foreach dövrəsində) oxunur. Bu, çox böyük fayllar üçün daha effektivdir, çünki bütün faylı RAM-a yükləmək istəmirsən və ya edə bilmirsən.
4. Sətr massivinin yazılması
Bəzən səndə sətr siyahısı olur (məsələn, hansısa kolleksiyadan) və hər sətri ayrıca faylda qeyd etmək istəyirsən.
File.WriteAllLines(path, contents)
Bu metod sətr massivini (və ya istənilən sətr kolleksiyasını) qəbul edir və hər sətri faylda ayrıca sətr kimi yazır. WriteAllText() kimi, əgər fayl artıq varsa, üstündən yazır.
string membersFilePath = "participants.txt";
string[] names = { "İvan Petrov", "Mariya Sidorova", "Sergey Kozlov", "Anna Kuznetsova" };
// Massivin hər sətri faylda ayrıca sətr kimi yazılacaq
File.WriteAllLines(membersFilePath, names);
// Məzmunu yoxlayaq
Console.WriteLine($"'{membersFilePath}' faylının məzmunu:");
foreach (string line in File.ReadLines(membersFilePath))
Console.WriteLine($"- {line}");
5. Binar fayllarla işləmək
File sinfi yalnız mətn məlumatları ilə məhdudlaşmır. O, həmçinin binar məlumatların oxunması və yazılması üçün rahat metodlar təqdim edir, yəni xam baytlar. Bu, məsələn, xüsusi formatda sazlamaları saxlamaq, şəkillərlə, audio ilə və ya adi mətn olmayan istənilən məlumatlarla işləmək üçün faydalıdır.
Bayt massivinin yazılması: File.WriteAllBytes() Faylı yaradır və ya üstündən yazır, bütün verilmiş bayt massivini ora yazır.
string binaryDataPath = "settings.bin";
// Binar məlumat nümunəsi: şəkil, video, istənilən məlumat
byte[] settingsData = { 0x01, 0x0A, 0x2C, 0xFF, 0x00, 0x3F }; // Bir növ "xam" sazlamalar
File.WriteAllBytes(binaryDataPath, settingsData);
Console.WriteLine($"Binar məlumatlar '{binaryDataPath}' faylına yazıldı.");
Vacib: Əgər sən 'settings.bin'-i Notepad-da açsan, oxunmaz simvollar ("krakozyabra") görəcəksən, çünki bu baytlar mətn kimi şərh olunmaq üçün nəzərdə tutulmayıb.
Bayt massivinin oxunması: File.ReadAllBytes() Binar faylın bütün məzmununu bayt massivinə oxuyur.
if (File.Exists(binaryDataPath))
{
byte[] readSettings = File.ReadAllBytes(binaryDataPath);
Console.WriteLine($"'{binaryDataPath}' faylından {readSettings.Length} bayt oxundu.");
Console.Write("Oxunan baytlar (onaltılıq formada): ");
foreach (byte b in readSettings)
Console.Write($"{b:X2} "); // :X2 baytı iki rəqəmli onaltılıq kimi formatlayır
Console.WriteLine();
}
else
{
Console.WriteLine($"Xəta: '{binaryDataPath}' binar faylı tapılmadı.");
}
Bu metodlar kiçik həcmli binar məlumatları saxlamaq üçün çox rahatdır, məsələn, kiçik şəkillərin keşlənməsi və ya serializasiya olunmuş obyektlər üçün.
6. Diskdə faylların idarə olunması
File sinfi həmçinin diskin üzərində faylları idarə etmək üçün metodlar təqdim edir.
Faylın mövcudluğunu yoxlamaq: File.Exists(path) Əgər göstərilən yolda fayl varsa true, yoxdursa false qaytarır. Fayl tapılmadıqda səhv çıxmasın deyə oxumaq, silmək və ya digər əməliyyatlardan əvvəl bu metodu istifadə etmək çox tövsiyə olunur.
string myFileToCheck = "report.txt";
// Nümunə üçün əvvəlcə yaradaq
File.WriteAllText(myFileToCheck, "Test hesabatı.");
if (File.Exists(myFileToCheck))
{
Console.WriteLine($"'{myFileToCheck}' faylı tapıldı.");
// İndi təhlükəsiz şəkildə oxumaq, silmək və s. olar
}
else
{
Console.WriteLine($"'{myFileToCheck}' faylı tapılmadı.");
}
Faylın silinməsi: File.Delete(path) faylı diskdən geri dönməz şəkildə silir. Çox ehtiyatlı ol, bu əməliyyat geri qaytarılmır!
string fileToDelete = "temp_file.txt";
// Nümunə üçün fayl yaradaq
File.WriteAllText(fileToDelete, "Bu fayl silinəcək.");
if (File.Exists(fileToDelete))
{
File.Delete(fileToDelete);
Console.WriteLine($"'{fileToDelete}' faylı uğurla silindi.");
}
else
{
Console.WriteLine($"'{fileToDelete}' faylı artıq yoxdur və ya əvvəl silinib.");
}
7. Fayllarla işləyərkən istisnalar
Fayllarla işləmək həmişə əməliyyat sistemi və xarici resurslarla qarşılıqlı əlaqə deməkdir, bu da onu potensial olaraq səhvlərə açıq edir.
İstisnaları (xətaları) işlət! Fayllarla işləyərkən bir çox problem baş verə bilər və proqramın sadəcə "çökməməsi" üçün onları düzgün işlətmək lazımdır. Tipik hallar:
- FileNotFoundException: Göstərilən yolda müraciət etdiyin fayl yoxdur.
- DirectoryNotFoundException: Faylı yaratmaq və ya tapmaq istədiyin qovluq yoxdur.
- UnauthorizedAccessException: Proqramın fayl/qovluq üçün oxuma, yazma və ya silmə icazəsi yoxdur (məsələn, fayl sistem faylıdır və ya qorunan zonadadır).
- IOException: Ümumi giriş/çıxış xətası, adətən fayl başqa proqram tərəfindən açıq və bloklanıbsa və ya diskdə yer yoxdursa baş verir.
Fayllarla təhlükəsiz işləmək üçün həmişə try-catch konstruksiyasından istifadə et. Bu, xətanı "tutmağa" və uyğun tədbir görməyə imkan verir (məsələn, istifadəçiyə mesaj göstərmək, loga yazmaq).
string sensitiveFilePath = "secret_data.txt";
try
{
// Ola bilsin ki, mövcud olmayan və ya icazə olmayan faylı oxumağa cəhd
string secretContent = File.ReadAllText(sensitiveFilePath);
Console.WriteLine($"Gizli məzmun oxundu: {secretContent}");
}
catch (FileNotFoundException) // Konkret xəta: fayl tapılmadı
{
Console.WriteLine($"Xəta: '{sensitiveFilePath}' faylı tapılmadı. Yolun düzgünlüyünə əmin ol.");
}
catch (IOException ex) // Ümumi giriş/çıxış xətası (məsələn, fayl bloklanıb)
{
Console.WriteLine($"'{sensitiveFilePath}' faylı ilə işləyərkən giriş/çıxış xətası: {ex.Message}");
}
catch (Exception ex) // İstənilən başqa gözlənilməz xəta
{
Console.WriteLine($"Gözlənilməz xəta baş verdi: {ex.Message}");
}
8. System.IO.File nə vaxt ən yaxşı seçim deyil?
File sinfi çox universal olsa da, elə ssenarilər var ki, onu istifadə etmək optimal deyil və ya mümkün deyil:
Nəhəng fayllar (onlarla+ GB): ReadAllText()/ReadAllBytes() metodları bütün faylı RAM-a yükləyir. Çox böyük fayllar üçün bu, OutOfMemoryException verəcək. Belə hallarda File.ReadLines() (mətn üçün) və ya birbaşa axınlar (Streams) (FileStream) ilə hissə-hissə oxuma/yazma lazımdır. (Axınlar barədə növbəti mühazirədə danışılacaq).
Fayl çıxışına incə nəzarət: Əgər sənə faylı necə açmaq barədə çox spesifik nəzarət lazımdırsa (məsələn, eksklüziv çıxış, heç kim oxuya və ya yaza bilməsin, ya da əksinə, bir neçə proses eyni anda oxuya bilsin), File belə detalları təmin etmir. Bunun üçün daha aşağı səviyyəli axın sinifləri lazımdır.
Asinxron əməliyyatlar: Yüksək performanslı tətbiqlər üçün, hansı ki, fayl əməliyyatlarını əsas axını bloklamadan yerinə yetirmək lazımdır (məsələn, web-serverlərdə), asinxron metodlar lazımdır (məsələn, ReadAllTextAsync()), onlar da axınlar üzərində qurulub.
Hissəvi oxuma/yazma: Əgər sənə faylın yalnız bir hissəsini müəyyən yerdən oxumaq və ya mövcud faylın ortasına yazmaq lazımdırsa, File metodları uyğun deyil. Bunun üçün birbaşa fayl axınına çıxış lazımdır.
9. Yekun
Niyə System.IO.File bu qədər populyardır?
- Sadəlik və qısa kod: Statik metodları sayəsində mürəkkəb əməliyyatları bir-iki sətr kodla yerinə yetirmək olur. Bu, proqramlaşdırmanı xeyli asanlaşdırır və kodu oxunaqlı edir.
- Resursların avtomatik idarə olunması: File hər əməliyyat üçün faylı özü açıb-bağlayır, səni əl ilə resurs idarəçiliyindən azad edir (bu isə tez-tez səhvlərə səbəb olur).
- Gündəlik tapşırıqlar üçün universallıq: Kiçik və orta ölçülü mətn və binar fayllarla tipik əməliyyatlar üçün File imkanları tam yetərlidir.
- Yayğınlıq: Əksər praktik tapşırıqlarda və müsahibələrdə səndən File sinfinin metodlarını yaxşı bilməyin gözlənilir.
- Gizli mürəkkəblik: Bütün metodlar elə yazılıb ki, OS ilə mürəkkəb qarşılıqlı əlaqəni gizlədir və sənə təmiz, başadüşülən interfeys verir.
Tez-tez verilən suallar və dəqiqləşdirmələr
File.ReadAllText() üçün maksimal fayl ölçüsü nə qədər ola bilər?
Bir neçə on MB-a qədər fayllar üçün (< 100 MB) adətən heç bir problem olmur. Əgər fayl daha böyükdürsə (yüzlərlə MB, GB-larla), File.ReadAllText() istifadə etmək RAM-ın tükənməsinə (və OutOfMemoryException xətasına) səbəb ola bilər. Belə hallarda sətr-sətr oxumaq üçün File.ReadLines() və ya daha inkişaf etmiş axın alətlərindən istifadə etmək lazımdır, onları sonra öyrənəcəksən.
Olmayan qovluqda fayl yaratmaq/yazmaq olar?
Xeyr. File.WriteAllText(), File.WriteAllBytes() və digər metodlar valideyn qovluqları avtomatik yaratmır. Əgər sən C:\MyAppData\Logs\current.log yolunu göstərirsənsə, amma MyAppData və ya Logs qovluqları yoxdursa, DirectoryNotFoundException çıxacaq. Əvvəlcə bütün lazımi qovluqların mövcudluğuna əmin olmalısan, bunun üçün System.IO.Directory sinfinin metodlarından istifadə et (məsələn, Directory.CreateDirectory("myfolder")).
Faylın yaradılma, dəyişmə tarixi və ya ölçüsünü necə öyrənmək olar?
Fayl haqqında daha detallı məlumat almaq üçün, məsələn, yaradılma tarixi, son dəyişmə tarixi, ölçü, atributlar (gizli, yalnız oxumaq və s.), System.IO.FileInfo sinfindən istifadə et. O, bir çox faydalı property-lər təqdim edir.
GO TO FULL VERSION