CodeGym /Kurslar /C# SELF /Nümunə əsaslı siniflər Fil...

Nümunə əsaslı siniflər FileInfo və DirectoryInfo

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

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
Name
Faylın adı
fileInfo.Name
FullName
Tam yol
fileInfo.FullName
Length
Faylın ölçüsü bayt ilə
fileInfo.Length
Directory
Valı qovluq (DirectoryInfo)
fileInfo.Directory.FullName
Exists
Fayl həqiqətən mövcuddurmu?
fileInfo.Exists
Extension
Faylın extension-u (.txt)
fileInfo.Extension
CreationTime
Yaradılma tarixi
fileInfo.CreationTime
LastWriteTime
Son dəyişiklik tarixi
fileInfo.LastWriteTime
IsReadOnly
Yalnız oxuma rejimindədir?
fileInfo.IsReadOnly
Metodlar
CopyTo()
Faylı kopyalamaq
fileInfo.CopyTo("copy.txt")
Delete()
Faylı silmək
fileInfo.Delete()
MoveTo()
Faylı köçürmək
fileInfo.MoveTo("move.txt")
OpenRead()
Oxumaq üçün stream açmaq
using var stream = fileInfo.OpenRead()
OpenWrite()
Yazmaq üçün stream açmaq
using var stream = fileInfo.OpenWrite()

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
Name
Qovluğun adı
dirInfo.Name
FullName
Tam yol
dirInfo.FullName
Parent
Valideyn qovluq (DirectoryInfo)
dirInfo.Parent.FullName
Exists
Qovluq mövcuddurmu?
dirInfo.Exists
CreationTime
Yaradılma tarixi
dirInfo.CreationTime
LastWriteTime
Dəyişmə tarixi
dirInfo.LastWriteTime
Metodlar
Create()
Qovluğu yaratmaq
dirInfo.Create()
Delete()
Qovluğu silmək
dirInfo.Delete()
GetFiles()
Faylların array-ı (array of FileInfo)
dirInfo.GetFiles()
GetDirectories()
Alt qovluqların array-ı (array of DirectoryInfo)
dirInfo.GetDirectories()
EnumerateFiles()
Faylları iterasiya etmək (IEnumerable<FileInfo>, gecikdirilmiş rejim)
dirInfo.EnumerateFiles()
MoveTo()
Qovluğu köçürmək
dirInfo.MoveTo("path")

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
File.Delete(path)
new FileInfo(path).Delete()
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.

2
Tapşırıq
C# SELF, səviyyə, dərs
Bağlanıb
Qovluqdakı faylların siyahısının çıxarılması
Qovluqdakı faylların siyahısının çıxarılması
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION