Lucrul cu fișiere - Clasele File și FileInfo
Similar cu perechea Directory/DirectoryInfo pentru lucrul cu fișiere, există perechea de clase File și FileInfo. Cu ajutorul acestora putem crea, șterge, muta fișiere, obține proprietățile lor și multe altele
FileInfo
Câteva metode și proprietăți utile ale clasei FileInfo:
- CopyTo(path): copiază fișierul într-o nouă locație specificată de calea path
- Create(): creează fișierul
- Delete(): șterge fișierul
- MoveTo(destFileName): mută fișierul într-o nouă locație
- Directory: obține directorul părinte sub forma unui obiect DirectoryInfo
- DirectoryName: obține calea completă către directorul părinte
- Exists: indică dacă fișierul există
- Length: obține dimensiunea fișierului
- Extension: obține extensia fișierului
- Name: obține numele fișierului
- FullName: obține numele complet al fișierului
Pentru a crea un obiect FileInfo se folosește constructorul care primește ca parametru calea către fișier:
FileInfo fileInf = new FileInfo(@"C:\app\content.txt");
Clasa File
Clasa File implementează o funcționalitate similară folosind metode statice:
- Copy(): copiază fișierul într-o nouă locație
- Create(): creează fișierul
- Delete(): șterge fișierul
- Move: mută fișierul într-o nouă locație
- Exists(file): determină dacă fișierul există
Căi către fișiere
Pentru lucrul cu fișiere, putem folosi atât căi absolute, cât și căi relative:
// căi absolute
string path1 = @"C:\Users\eugene\Documents\content.txt"; // pentru Windows
string path2 = "C:\\Users\\eugene\\Documents\\content.txt"; // pentru Windows
string path3 = "/Users/eugene/Documents/content.txt"; // pentru MacOS/Linux
// căi relative
string path4 = "MyDir\\content.txt"; // pentru Windows
string path5 = "MyDir/content.txt"; // pentru MacOS/Linux
Obținerea informațiilor despre un fișier
string path = @"C:\Users\eugene\Documents\content.txt";
// string path = "/Users/eugene/Documents/content.txt"; // pentru MacOS/Linux
FileInfo fileInfo = new FileInfo(path);
if (fileInfo.Exists)
{
Console.WriteLine($"Nume fișier: {fileInfo.Name}");
Console.WriteLine($"Timp de creare: {fileInfo.CreationTime}");
Console.WriteLine($"Dimensiune: {fileInfo.Length}");
}
Ștergerea unui fișier
string path = @"C:\app\content.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
fileInf.Delete();
// alternativ folosind clasa File
// File.Delete(path);
}
Mutarea unui fișier
string path = @"C:\OldDir\content.txt";
string newPath = @"C:\NewDir\index.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
fileInf.MoveTo(newPath);
// alternativ folosind clasa File
// File.Move(path, newPath);
}
Dacă fișierul de la noua cale deja există, se poate folosi un parametru suplimentar pentru a specifica dacă fișierul trebuie suprascris (cu valoarea true fișierul este suprascris):
string path = @"C:\OldDir\content.txt";
string newPath = @"C:\NewDir\index.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
fileInf.MoveTo(newPath, true);
// alternativ folosind clasa File
// File.Move(path, newPath, true);
}
Copierea unui fișier
string path = @"C:\OldDir\content.txt";
string newPath = @"C:\NewDir\index2.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
{
fileInf.CopyTo(newPath, true);
// alternativ folosind clasa File
// File.Copy(path, newPath, true);
}
Metoda CopyTo a clasei FileInfo primește doi parametri: calea către care fișierul va fi copiat și o valoare booleană care indică dacă fișierul trebuie suprascris la copiere (dacă valoarea este true, fișierul va fi suprascris). Dacă se transmite false ca ultim parametru și un astfel de fișier deja există, aplicația va arunca o eroare.
Metoda Copy a clasei File primește trei parametri: calea către fișierul sursă, calea către care fișierul va fi copiat și o valoare booleană care indică dacă fișierul va fi suprascris.
Citirea și scrierea fișierelor
Pe lângă metodele discutate anterior, clasa File oferă și o serie de metode pentru citirea și scrierea fișierelor text și binare:
- AppendAllLines(String, IEnumerable<String>) / AppendAllLinesAsync(String, IEnumerable<String>, CancellationToken): adaugă în fișier un set de linii. Dacă fișierul nu există, acesta este creat
- AppendAllText(String, String) / AppendAllTextAsync(String, String, CancellationToken): adaugă o linie în fișier. Dacă fișierul nu există, acesta este creat
- byte[] ReadAllBytes (string path) / Task<byte[]> ReadAllBytesAsync (string path, CancellationToken cancellationToken): citește conținutul fișierului binar într-un array de bytes
- string[] ReadAllLines (string path) / Task<string[]> ReadAllLinesAsync (string path, CancellationToken cancellationToken): citește conținutul fișierului text într-un array de stringuri
- string ReadAllText (string path) / Task<string> ReadAllTextAsync (string path, CancellationToken cancellationToken): citește conținutul fișierului text într-un string
- IEnumerable<string> ReadLines (string path): citește conținutul fișierului text într-o colecție de stringuri
- void WriteAllBytes (string path, byte[] bytes) / Task WriteAllBytesAsync (string path, byte[] bytes, CancellationToken cancellationToken): scrie un array de bytes într-un fișier binar. Dacă fișierul nu există, acesta este creat. Dacă există, este suprascris
- void WriteAllLines (string path, string[] contents) / Task WriteAllLinesAsync (string path, IEnumerable<string> contents, CancellationToken cancellationToken): scrie un array de stringuri într-un fișier text. Dacă fișierul nu există, acesta este creat. Dacă există, este suprascris
- WriteAllText (string path, string? contents) / Task WriteAllTextAsync (string path, string? contents, CancellationToken cancellationToken): scrie un string într-un fișier text. Dacă fișierul nu există, acesta este creat. Dacă există, este suprascris
Aceste metode acoperă practic toate scenariile principale - citirea și scrierea fișierelor text și binare. În funcție de sarcină, se pot folosi metode sincrone sau variantele lor asincrone.
De exemplu, să scriem și să citim înapoi un fișier text:
string path = @"c:\app\content.txt";
string originalText = "Hello FDC.com";
// scrierea unui string
await File.WriteAllTextAsync(path, originalText);
// adăugarea la sfârșitul fișierului
await File.AppendAllTextAsync(path, "\nHello work");
// citirea fișierului
string fileText = await File.ReadAllTextAsync(path);
Console.WriteLine(fileText);
Ieșirea în consolă:
Hello FDC.com
Hello work
Este de remarcat faptul că la adăugarea textului am inclus în string secvența "\n", care face trecerea la rândul următor. Datorită acestui fapt, textul adăugat apare pe un nou rând în fișier.
Dacă dorim ca adăugarea în fișier să se facă de la început pe un nou rând, ar trebui să folosim metoda WriteAllLines/WriteAllLinesAsync pentru scriere și AppendAllLines/AppendAllLinesAsync pentru adăugare:
await File.WriteAllLinesAsync(path, new[] { "Hello FDC.com", "Hello work" });
Similar, pentru citirea fișierului, dacă dorim să citim fiecare rând separat, în loc de ReadAllText/ReadAllTextAsync, se aplică ReadAllLines/ReadAllLinesAsync.
Codificarea
Ca parametru suplimentar, metodele de citire-scriere a fișierelor text permit stabilirea codificării sub forma unui obiect System.Text.Encoding:
using System.Text;
string path = "/Users/eugene/Documents/app/content.txt";
string originalText = "Привет FDC.com";
// scrierea unui string
await File.WriteAllTextAsync(path, originalText, Encoding.Unicode);
// adăugarea la sfârșitul fișierului
await File.AppendAllTextAsync(path, "\nПривет мир", Encoding.Unicode);
// citirea fișierului
string fileText = await File.ReadAllTextAsync(path, Encoding.Unicode);
Console.WriteLine(fileText);
Pentru a stabili codificarea la scriere și citire, aici se folosește valoarea predefinită Encoding.Unicode. De asemenea, se poate specifica un nume de codificare, singura condiție fiind să ne asigurăm că sistemul de operare curent suportă codificarea aleasă:
using System.Text;
string path = @"c:\app\content.txt";
string originalText = "Hello FDC.com";
// scrierea unui string
await File.WriteAllTextAsync(path, originalText, Encoding.GetEncoding("iso-8859-1"));
// adăugarea la sfârșitul fișierului
await File.AppendAllTextAsync(path, "\nHello code", Encoding.GetEncoding("iso-8859-1"));
// citirea fișierului
string fileText = await File.ReadAllTextAsync(path, Encoding.GetEncoding("iso-8859-1"));
Console.WriteLine(fileText);