Mai intai, sa ne reamintim ce inseamna un spatiu de nume.
De multe ori, aplicatiile au nevoie sa stocheze date pe hard-disk (salvarea intre mai multe sesiuni ale datelor aplicatiei, data logging, troubleshooting, comunicarea cu alte aplicatii, compresarea, decompresarea datelor, etc). Pentru aceasta, aplicatiile vor folosi clasele din System.IO:
using System.IO;
System.IO contine clase care pot fi folosite la exploatarea, administrarea fisierelor si directoarelor din sistemul de operare.
Clasele DirectoryInfo si Directory
Aceasta clasa contine metode statice pentru crearea, mutarea directoarelor, afisarea subdirectoarelor. Clasa nu poate fi mostenita.
Alegem directorul Windows pentru a-i afisa subdirectoarele.
DirectoryInfo di = new DirectoryInfo(@"C:\Windows"); //cream un vector de obiecte DirectoryInfo //obtinute prin apelul metodei GetDirectories DirectoryInfo[] subDirs = di.GetDirectories(); Console.WriteLine("Directoare"); //afisam in consola fiecare director din vector foreach (DirectoryInfo subDir in subDirs) { Console.WriteLine(subDir.Name); }
Aceasta clasa ajuta la furnizarea multor informatii cu privire la directoare: nume, cale, marime, extensii, data crearii, data ultimei accesari.
Metodele uzuale sunt Create (creeaza un director), Delete (sterge atat directorul cat si continutul sau), MoveTo (muta directorul si continutul sau la o alta cale), CreateSubirectory, GetFiles (returneaza lista de fisiere continute in directorul respectiv).
Descriere detaliata si membrii clasei DirectoryInfo, pe siteul Microsoft.
O alta clasa folosita pentru lucrul cu directoarele din sistemul de fisiere, este Directory. Diferenta consta in faptul ca aceasta contine doar metode statice si se poate efectua doar o singura operatie asupra unui director. Nu mai este necesar construirea unui obiect care sa reprezinte directorul. Se intelege usor ca pentru situatiile cand e nevoie de efectuarea mai multor operatii pe un director, se recomanda folosirea clasei DirectoryInfo.
O sa cream un director(folder) nou.
Exemplu:
//cream un director nou //constructorul clasei va primi ca parametru calea //unde va fi creat noul director DirectoryInfo directorNou = new DirectoryInfo(@"C:\DirectorTest"); //testam daca directorul exista if (directorNou.Exists) Console.WriteLine("Directorul exista deja."); //daca nu exista, il cream else { directorNou.Create(); Console.WriteLine("Directorul a fost creat."); }
Clasele FileInfo si File
In directorul recent creat, vom crea fisiere pe care le vom muta, copia, sterge.
Atunci cand vrem sa creem fisiere cu ajutorul programarii in C#, putem folosi clasele File sau FileInfo. Diferenta intre ele, consta in faptul ca File are metode statice care efectueaza o singura operatie asupra unui fisier, iar metodele din FileInfo pot fi apelate pentru mai multe operatii asupra unui fisier. Diferenta este aceeasi ca si in cazul Directory si DirectoryInfo.
Crearea unui fisier text:
prin apelarea metodei statice File.Create()
File.Create(@"C:\DirectorTest\exemplu.txt");
prin apelarea metoda unui obiect de tipul FileInfo:
FileInfo fisier = new FileInfo(@"C:\DirectorTest\exempluDoi.txt"); // creeam fisierul fisier.Create();
Apelam metoda WriteAllText pentru a crearea unui fisier text, scrierea unui string in el si apoi inchiderea acestuia.
File.WriteAllText(@"C:\DirectorTest\exmpluFisierScris.txt", "text pentru test");
Copierea unui fisier:
File.WriteAllText(@"C:\DirectorTest\test1.txt", "text/copiere"); File.Copy(@"C:\DirectorTest\test1.txt",@"C:\DirectorTest\test2.txt");
Mutarea unui fisier:
File.WriteAllText(@"C:\DirectorTest\test1.txt", "text/mutare"); File.Move(@"C:\DirectorTest\test1.txt",@"C:\DirectorTest\test2.txt");
Mai multe detalii despre FileInfo si File.
Clasa FileSystemInfo
Clasa FileSystemInfo reprezinta baza pentru DirectoryInfo si FileInfo. Nu se poate creea o instanta a acesteia, pentru ca este o clasa abstracta. O lista cu metodele si proprietatile ei, aici.
Clase BinaryWriter si BinaryReader
Aceste clase scriu si citesc orice tip de date de baza intr-un format binar.
Inainte de folosirea claselor, vom crea un obiect de tip FileStream. Aceasta clasa creeaza sau deschide un fisier.
//filestream pentru fisierul test FileStream fisierScriere = new FileStream(@"C:\directortest\testbinar", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); //cu ajutorul fileStream, obiectul binarywriter //va scrie fluxul in fisier BinaryWriter bw = new BinaryWriter(fisierScriere);
Vom declara variabilele si le vom scrie binar.
//variabile string sir = "text"; char car = 'a'; int numar = 10; //scriem valorile in format binar bw.Write(sir); bw.Write(car); bw.Write(numar);
Apelam metoda Close pentru eliberarea obiectelor de tip BinaryWriter si FileStream.
//inchidem si eliberam resursele
bw.Close();
Pentru citirea fisierului binar, creem din nou un obiect FileStream si apoi, un obiect BinaryReader, clasa complementara a BinaryWriter.
FileStream fisierCitire = new FileStream(@"C:\directortest\testbinar", FileMode.Open, FileAccess.Read, FileShare.None); BinaryReader br = new BinaryReader(fisierCitire); //facem ca citirea sa aiba loc de la inceputul fisierului br.BaseStream.Seek(0, SeekOrigin.Begin);
Functia Read poate citi tipurile de date pe care functia Write le scrie. Diferenta consta in faptul ca BinaryWriter are o singura metoda Write pentru scriere, in timp ce BinaryReader are o metoda Read pentru fiecare tip de date (normal, pentru ca fiecare metoda va returna un tip de data diferit). Dupa terminarea citirii, eliberam memoria prin apelul functiei Close.
//retine in variabile string sirCitit = br.ReadString(); char carCitit = br.ReadChar(); int numarCitit = br.ReadInt16(); //afiseaza in consola Console.WriteLine(sirCitit); Console.WriteLine(carCitit); Console.WriteLine(numarCitit); //inchide si elibereaza resursele br.Close();
Este recomandat ca la citirea fisierelor binare, sa se foloseasca mecanismul de “prindere” a exceptiilor (try-catch).
Descriere detaliata a claselor FileStream, BinaryWriter, BinaryReader.
Clasele TextReader si TextWriter sunt clase de baza. Clasele StreamReader si StringReader deriveaza din TextReader. In mod similar, StreamWriter si StringWriter deriveaza din clasa abstracta TextWriter.
StreamWritersi StreamReader sunt folosite in scrierea/citirea unui flux(stream) intr-o anumita codificare.
StringWriter si StringReader sunt folosite pentru scrierea/citirea sirurilor de caractere in memorie.
Clasa FileSystemWatcher
Aceasta clasa contine metode, proprietati, care semnaleaza evenimente atunci cand au loc modificari asupra fisierelor sau directoarelor dintr-un anumit director.
Exemplu:
Construim un obiect de tipul FileSystemWatcher, care va anunta daca un fisier dintr-un anumit director a fost, de exemplu, redenumit.
FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = @"C:\directortest";
Vom fi anuntati la redenumirea oricarui fisier sau director din directortest.
//incepe urmarirea schimbarilor watcher.EnableRaisingEvents = true; //ne anunta doar in cazul redenumirilor //delegate pentru eveniment watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
Metoda indicata de delegate pentru evenimentul de redenumire va afisa fostul nume al fisierului/directorului si numele curent.
private void watcher_Renamed(object sender, RenamedEventArgs e) { Console.WriteLine("Redenumit:" + e.OldName + " in " + e.Name); }
Se observa ca acest eveniment transmite un parametru de tip RenamedEventHandler. Este un caz singular, celelalte evenimente din aceasta clasa vor transmite eveniment de tip FileSystemEventHandler.
watcher.Deleted += new FileSystemEventHandler(watcher_Deleted); void watcher_Deleted(object sender, FileSystemEventArgs e) { Console.WriteLine("A fost sters "+e.Name+" din " + e.FullPath); }
Obiectul watchermai poate folosi proprietatea Filter, pentru restrangerea ariei de fisiere urmarite pentru modificari, proprieatea IncludeSubdirectories, pentru a urmari subdirectoare.
O lista detaliata cu toti membrii clasei se gaseste pe msdn.
Puteti citi mai multe despre spatiul de nume System.IO, pe msdn.
Dezvoltatorii au nevoie adesea sa acceseze fisierele si directoarele pentru a obtine informatii si a efectua modificari. Spatiul de nume System.IO furnizeaza toate clasele necesare.
In articolul urmator, o sa descriu spatiul de nume System.Collection.