Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Operatii IO in .Net – System.IO pe scurt

   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.

Category: Uncategorized

Your email address will not be published. Required fields are marked *

*