1. Giriş
Əgər statik siniflər, məsələn File və Directory, — hər zaman əl altında olan, sürətlə işi həll edən, amma konkret obyektə bağlı olmayan universal çəngəl-bıçaq kimidirsə, onda FileInfo və DirectoryInfo — konkret fayl və ya qovluq üçün yaradılan personal alət kimidir: onlar həmin obyekt barədə çox şey "bilir" və bir obyektlə bir neçə əməliyyat aparanda daha rahat və çevik işləməyə imkan verir.
Nümunə əsaslı siniflər fayl sisteminin konkret obyekti barədə detallar saxlayır, və xüsusiyyətlər ilk dəfə yükləndikdən sonra (obyekt köhnəlməyibsə) fayl sisteminə yenidən müraciət etməyə ehtiyac olmaya bilər.
- FileInfo — konkret faylla işləmək üçün.
- DirectoryInfo — konkret direktoriyaya (qovluğa) işləmək üçün.
Onlar fayl/qovluq haqqında ətraflı məlumat (ölçü, yaradılma tarixi, extension, mövcud atributlar) almağa və fayl/qovluq üzərində müxtəlif əməliyyatlar (kopyalama, silmə, köçürmə və s.) yerinə yetirməyə imkan verən xüsusiyyətlər və metodlar ehtiva edir.
FileInfo və DirectoryInfo necə təşkil olunub
Hər iki sinif ümumi abstrakt sinifdən törənir: FileSystemInfo, bu isə fayllarla və qovluqlarla işləyən kodu bir yerdə yazmağa imkan verir.
System.Object
|
System.MarshalByRefObject
|
System.IO.FileSystemInfo (abstrakt sinif)
| |
FileInfo DirectoryInfo
Nümunə əsaslı siniflərdən nə vaxt istifadə etməli?
- Əgər bir fayl/qovluq haqqında çoxlu məlumat lazımdırsa (ölçü, modifikasiya tarixi, extension, atributlar və s.) və bu məlumatlar birdən çox istifadə olunacaqsa.
- Əgər kataloqdakı bütün faylları/qovluqları dövr etməyi və hər bir obyekti "canlı" nümunə kimi işləməyi planlaşdırırsınızsa.
- Fayl sisteminə artıq-əldə müraciət etməmək üçün optimizasiya məqsədi ilə (keşləmə vacibdirsə).
- Obyekt-yonümlü kod yazmaq üçün (backup-lar, media kitabxanası, fayl meneceri və s.).
FileInfo və DirectoryInfo nümunəsini necə yaratmaq
using System.IO;
// Mövcud (və ya mövcud olmayacaq!) fayl üçün FileInfo obyektinin yaradılması:
var fileInfo = new FileInfo("notes.txt");
// Qovluq üçün DirectoryInfo obyektinin yaradılması:
var dirInfo = new DirectoryInfo(@"C:\Projects");
// Nisbi və ya tam yollar istifadə etmək olar!
Vacib məqam: FileInfo və ya DirectoryInfo obyektinin yaradılması faylı/qovluğu fayl sistemində YARATMIR! Bu yalnız təsvir edir (link üzrə əlaqə).
2. FileInfo ilə işləmək
Gəlin bu sinifin əsas xüsusiyyətləri və metodlarını nəzərdən keçirək. Qısa xatırlatma:
| Xüsusiyyət/metod | Nə qaytarır? | İstifadə nümunəsi |
|---|---|---|
|
Faylın adı | |
|
Tam yol | |
|
Faylın ölçüsü bayt ilə | |
|
Valı qovluq (DirectoryInfo) | |
|
Fayl həqiqətən mövcuddurmu? | |
|
Faylın extension-u (.txt) | |
|
Yaradılma tarixi | |
|
Son dəyişiklik tarixi | |
|
Yalnız oxuma rejimindədir? | |
| Metodlar | ||
|
Faylı kopyalamaq | |
|
Faylı silmək | |
|
Faylı köçürmək | |
|
Oxumaq üçün stream açmaq | |
|
Yazmaq üçün stream açmaq | |
Nümunə: Fayl haqqında məlumat
Kiçik modul əlavə edək ki, FileInfo-dən istifadə edərək faylın ətraflı məlumatını alır.
Console.WriteLine("Faylın adını daxil edin:");
string fileName = Console.ReadLine();
var file = new FileInfo(fileName);
if (file.Exists)
{
Console.WriteLine($"Faylın adı: {file.Name}");
Console.WriteLine($"Yol: {file.FullName}");
Console.WriteLine($"Ölçü: {file.Length} bayt");
Console.WriteLine($"Extension: {file.Extension}");
Console.WriteLine($"Yaradılma tarixi: {file.CreationTime}");
Console.WriteLine($"Son dəyişiklik: {file.LastWriteTime}");
// Əlavə: valideyn qovluğu göstər
Console.WriteLine($"Valideyn qovluq: {file.DirectoryName}");
}
else
{
Console.WriteLine("Fayl tapılmadı.");
}
Nəzərə alın: biz faylın məzmununu oxumur, yalnız meta-məlumat alırıq.
Praktika: Faylı kopyalama və silmə
// ... Əsas metodun içində fayl barədə məlumat uğurla çıxarıldıqdan sonra:
Console.WriteLine("Faylın kopyası üçün yolu daxil edin:");
string copyPath = Console.ReadLine();
try
{
file.CopyTo(copyPath);
Console.WriteLine($"Fayl uğurla {copyPath} ünvanına kopyalandı");
}
catch (IOException ex)
{
Console.WriteLine($"Faylı kopyalamaq mümkün olmadı: {ex.Message}");
}
// İndi kopyanı silək
Console.WriteLine("Kopyanı silmək istəyirsiniz? (y/n):");
if (Console.ReadLine().Trim().ToLower() == "y")
{
var copyFile = new FileInfo(copyPath);
if (copyFile.Exists)
{
copyFile.Delete();
Console.WriteLine("Kopya silindi.");
}
}
3. DirectoryInfo ilə işləmək
Gəlin görək DirectoryInfo nə təklif edir:
| Xüsusiyyət/metod | Nə qaytarır? | İstifadə nümunəsi |
|---|---|---|
|
Qovluğun adı | |
|
Tam yol | |
|
Valideyn qovluq (DirectoryInfo) | |
|
Qovluq mövcuddurmu? | |
|
Yaradılma tarixi | |
|
Dəyişmə tarixi | |
| Metodlar | ||
|
Qovluğu yaratmaq | |
|
Qovluğu silmək | |
|
Faylların array-ı (array of FileInfo) | |
|
Alt qovluqların array-ı (array of DirectoryInfo) | |
|
Faylları iterasiya etmək (IEnumerable<FileInfo>, gecikdirilmiş rejim) | |
|
Qovluğu köçürmək | |
Nümunə: Faylların və qovluqların dövr edilməsi
Console.WriteLine("Qovluğun yolunu daxil edin:");
string path = Console.ReadLine();
var dir = new DirectoryInfo(path);
if (!dir.Exists)
{
Console.WriteLine("Qovluq tapılmadı!");
return;
}
Console.WriteLine("\n--- Fayllar ---");
foreach (var file in dir.GetFiles())
{
Console.WriteLine($"{file.Name} ({file.Length} bayt)");
}
Console.WriteLine("\n--- Alt qovluqlar ---");
foreach (var subDir in dir.GetDirectories())
{
Console.WriteLine(subDir.Name);
}
4. Faydalı incə məqamlar
Statik metodlar vs nümunə əsaslı siniflər
Hansı yanaşmanı istifadə etmək lazımdır? Əgər sürətli "birdəfəlik" əməliyyat edirsinizsə — məsələn, File.Exists(path) və ya File.ReadAllText(path) — statik metodlar daha münasibdir. Onlar sadədir və kiçik overhead sayəsində bir qədər sürətlidir.
Amma əgər fayl və ya qovluq haqqında çoxlu məlumat almaq, həmin obyekt üzərində təkrarlanan əməliyyatlar yerinə yetirmək və ya sadəcə OOP üslubunda kod yazırsınızsa — nümunə əsaslı FileInfo və DirectoryInfo-dən istifadə etmək daha yaxşıdır.
Maraqlıdır ki, hər iki yanaşma "alt qatda" oxşar sistem çağırışlarından istifadə edir. Amma nümunə əsaslı siniflər bəzi xüsusiyyətləri (ölçü, tarix, atributlar) keşləyir və bu, böyük miqdarda faylları dövr edərkən faydalıdır — fayl sisteminə müraciətlərin sayını azaldır.
Tarix və zamanla işləmək haqqında bir az
Xüsusiyyətlər CreationTime, LastWriteTime, LastAccessTime DateTime tipində dəyərlər qaytarır.
Console.WriteLine($"Fayl yaradılıb: {file.CreationTime:yyyy-MM-dd HH:mm:ss}");
Console.WriteLine($"Son dəyişiklik: {file.LastWriteTime:yyyy-MM-dd HH:mm:ss}");
Əgər fayl və ya qovluq sizin obyektinizi yaratdıqdan sonra diskdə dəyişilibsə, keşlənmiş məlumat köhnəlmiş ola bilər. Məlumatı yeniləmək üçün file.Refresh() çağırın.
Məsləhətlər və praktik qeydlər
- Nümunə əsaslı siniflər fayl sisteminin ətrafına wrapper (obertka) quranda rahatdır: backup-lar, media kitabxanası, indeksator və s.
- LINQ ilə əla işləyirlər: ölçüyə, tarixə və ya extension-a görə filterləyib seçilmiş obyektlər üzərində əməliyyat apara bilərsiniz.
- Kütləvi əməliyyatlarda EnumerateFiles() və EnumerateDirectories() istifadə etmək GetFiles()/GetDirectories()-dən daha məsləhətlidir — lazy enumerasiya yaddaşı qənaətlə istifadə edir və işləməyə daha sürətli başlayır.
Statik və nümunə əsaslı yanaşmanın müqayisəsi
| Statik metodlar | Nümunə əsaslı siniflər | |
|---|---|---|
| Sintaksis | |
|
| Keşləmə | Yox | Bəli |
| Çoxlu məlumat | Çoxlu metod çağırmaq lazımdır | Obyektdə mövcuddur |
| OOP-üslubu | Yox | Bəli |
| Kütləvi əməliyyatlar | Ona uyğun deyil | Uyğundur |
| Stream-lərlə iş | Var | Var |
Məlumatın və obyektlərin yenilənməsi
FileInfo/DirectoryInfo obyektləri xüsusiyyətləri ilk çağırışdan sonra keşləyir. Əgər obyekt (fayl və ya qovluq) nümunə yaradıldıqdan sonra diskdə dəyişdirilibsə, məlumatı yeniləmək üçün .Refresh() metodunu çağırın.
var file = new FileInfo("notes.txt");
long oldSize = file.Length;
// Bu müddətdə kimsə (və ya siz) faylı proqram xaricində dəyişdirir
file.Refresh();
long newSize = file.Length;
Bu nadir hallarda lazımlıdır, amma əgər proqramınız fayl sistemini izləyirsə — bu mexanizm vacibdir.
5. Nümunə əsaslı siniflərlə işləyərkən ümumi səhvlər
Yanılma: əgər new FileInfo("file.txt") obyekti yaradılıbsa, fayl artıq mövcuddur. Əslində belə deyil — fayl yalnız açıq yazı əməliyyatı ilə və ya Create() çağırışı ilə yaranır.
Mövcud olmayan faylın xüsusiyyətlərini almağa cəhd etmək: bəzi xüsusiyyətlər standart dəyərlər qaytara bilər (məsələn, ölçü 0), amma oxuma üçün stream açmağa çalışmaq istisna atacaq.
Qovluqlarda da eyni: DirectoryInfo yaratmaq qovluğun diskinə avtomatik yaranmasını təmin etmir — buna görə Create() və ya qovluğun faktiki mövcudluğu tələb olunur.
GO TO FULL VERSION