folosirea colecțiilor de elementemapetrii/poo/depozit/curs9.pdf · clasa pune la dispoziție...

20
Programare orientată pe obiecte Curs 9 lect. dr. Marius Apetrii 1 Folosirea colecțiilor de elemente Pentru folosirea colecțiilor de elemente se pot utiliza tablourile unidimensionale sau multidimensionale precum și clase special create pentru manipularea colecțiilor de elemente. Aceste clase se găsesc în spațiile de n ume System.Collections sau System.Collections.Generic. Exemplu: const int NR_RANDURI=3; const int NR_COLOANE=2; static void Main(string[] args) { int[] a = new int[10];//tablou cu 10 elemente for (int i = 0; i < 10; i++) a[i] = i; String[] nume = new string[3] { "Ion", "John", "Johann" }; double[,] b = new double[3, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 } };//matrice cu 3 linii si 2 coloane int size = b.Length;//6 Complex[] linie = new Complex[NR_COLOANE]; for (int i = 0; i < linie.Length; i++) linie[i] = new Complex(i, 2 * i); Complex[][] matrice = new Complex[NR_RANDURI][];//tablou de tablouri for (int i = 0; i < matrice.Length; i++) { matrice[i] = new Complex[NR_COLOANE]; for (int j = 0; j < matrice[i].Length; j++) matrice[i][j] = new Complex(i, j); } //linie[2]=new Complex(3,2);//eroare, exceptie de tip 'System.IndexOutOfRangeException' } În exemplul de mai sus am folosit proprietatea Length pentru a citi dimensiunea tabloului. Se observă că elementele unui tablou pot fi de tipuri standard sau declarate de programator Pentru lucrul cu tablouri "dinamice" (dimensiune variabilă) putem folosi clasa List<T> din spațiul de nume System.Collections.Generic. Elementele listei pot fi accesate prin index. Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este List<T>() care crează o nouă instanță a clasei (o listă goală).

Upload: others

Post on 23-Feb-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 1

Folosirea colecțiilor de elemente

Pentru folosirea colecțiilor de elemente se pot utiliza tablourile unidimensionale sau

multidimensionale precum și clase special create pentru manipularea colecțiilor de

elemente. Aceste clase se găsesc în spațiile de nume System.Collections sau

System.Collections.Generic.

Exemplu: const int NR_RANDURI=3; const int NR_COLOANE=2; static void Main(string[] args) { int[] a = new int[10];//tablou cu 10 elemente for (int i = 0; i < 10; i++) a[i] = i; String[] nume = new string[3] { "Ion", "John", "Johann" }; double[,] b = new double[3, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 } };//matrice cu 3 linii si 2 coloane int size = b.Length;//6 Complex[] linie = new Complex[NR_COLOANE]; for (int i = 0; i < linie.Length; i++) linie[i] = new Complex(i, 2 * i); Complex[][] matrice = new Complex[NR_RANDURI][];//tablou de tablouri for (int i = 0; i < matrice.Length; i++) { matrice[i] = new Complex[NR_COLOANE]; for (int j = 0; j < matrice[i].Length; j++) matrice[i][j] = new Complex(i, j); } //linie[2]=new Complex(3,2);//eroare, exceptie de tip 'System.IndexOutOfRangeException' }

În exemplul de mai sus am folosit proprietatea Length pentru a citi dimensiunea

tabloului. Se observă că elementele unui tablou pot fi de tipuri standard sau declarate de

programator

Pentru lucrul cu tablouri "dinamice" (dimensiune variabilă) putem folosi clasa

List<T> din spațiul de nume System.Collections.Generic. Elementele listei pot fi accesate

prin index. Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor.

Un constructor al clasei este

List<T>()

care crează o nouă instanță a clasei (o listă goală).

Page 2: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 2

Numărul total de elemente ce poate fi reținut fără redimensionare poate fi controlat

prin intermediul proprietății Capacity. Nu este obligatorie redimensionarea, aceasta

făcându-se automat. Proprietatea Count permite citirea numărului de elemente din listă iar

proprietatea Index permite accesul la elementul de pe poziția specificată.

Printre metodele clasei regăsim:

Nume Descriere

Add Adaugă un obiect la sfârșitul listei.

AddRange Adaugă o colecție de obiecte la sfârșitul listei.

Clear Elimină toate elementele listei.

IndexOf(T) Intoarce indexul elementului specificat (dacă acesta există în listă).

Insert Adaugă un element cu indexul specificat.

Remove Elimină din listă primul element care coincide cu cel specificat

RemoveAt Elimină elementul de pe poziția specificată.

Reverse() Așează elementele listei în ordine inversă .

Reverse(Int32, Int32) Schimbă ordinea elementelor din intervalul specificat.

Sort(Comparison<T>) Sortează elementele listei folosind s the elements in the entire List<T>

using the specified System.Comparison<T>.

ToArray Copie elementele listei într-un tablou.

Observație: Elementele unei liste pot fi de tipul null și se accepta duplicate.

Pentru parcurgerea elementelor unei liste se poate folosi o formă specială a

instrucțiunii for și anume foreach ( a se vedea în exemplul de mai jos motoda diferenta din clasa Multime ).

Exemplu:

class Punct { private float x, y; private String text; public Punct(String text, float x = 0, float y = 0) { this.text = text; this.x = x; this.y = y; } public String Text {

Page 3: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 3

get { return text; } set { text = value; } } public float X { get { return x; } set { x = value; } } public float Y { get { return y; } set { y = value; } } } class Multime { String nume; List<Punct> elemente; public Multime(String nume) { this.nume = nume; this.elemente = new List<Punct>();//lista goala cu elemente de tip Punct } public String Nume { get { return nume; } set { nume = value; } } public int NrElemente {//numarul de elemente din lista get { return elemente.Count; } } public List<Punct> Elemente { get { return elemente; } set { elemente = value; } } public void adauga(Punct P) { elemente.Add(P);//adaugam un element la final } public void adauga(Punct P, int index) { try { elemente.Insert(index, P);//adaugam un element cu indexul index } catch (Exception) { elemente.Add(P); } } public void scrie() { String text = nume + "={"; if (NrElemente > 0) {

Page 4: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 4

text += elemente[0].Text; for (int i = 1; i < NrElemente; i++) text += "," + elemente[i].Text; } text += "}"; Console.WriteLine(text); } public void inverseazaElemente() { elemente.Reverse(); } public static Multime reuniune(Multime M1, Multime M2) { Multime M = new Multime(M1.Nume + "U" + M2.Nume); M.Elemente.AddRange(M1.Elemente); //daca am fi pus in locul instructiunii de mai sus //M->Elemente=M1->Elemente; //instructiunea urmatoare ar fi adaugat elementele si listei multimii M1 M.Elemente.AddRange(M2.Elemente); M.elimina_duplicate(); return M; } public static Multime diferenta(Multime M1, Multime M2) { Multime M = new Multime(M1.Nume + "/" + M2.Nume); M.Elemente.AddRange(M1.Elemente); foreach (Punct P in M2.Elemente) M.Elemente.Remove(P); return M; } public bool contine(Punct P) { return elemente.IndexOf(P) >= 0; } public void elimina_duplicate() { for (int i = 0; i < elemente.Count; i++) for (int j = i + 1; j < elemente.Count; j++) if (elemente[j] == elemente[i]) { elemente.RemoveAt(j); j--; } } public static int ascendent_dupa_X(Punct P1, Punct P2) { if(P1.X == P2.X)return 0; return P1.X > P2.X ? 1 : -1; } public static int descendent_dupa_X(Punct P1, Punct P2) { return -ascendent_dupa_X(P1, P2); } public static int ascendent_dupa_nume(Punct P1, Punct P2) { return String.Compare(P1.Text, P2.Text); } /*Pentru a folosi metoda Sort este important ca functia sa fie statica*/

Page 5: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 5

public void sorteaza(int tip) { switch (tip) { case 1://crescator dupa X elemente.Sort(new Comparison<Punct>(ascendent_dupa_X)); break; case 2://descrescator dupa X elemente.Sort(new Comparison<Punct>(descendent_dupa_X)); break; case 3://crescator dupa nume elemente.Sort(new Comparison<Punct>(ascendent_dupa_nume)); break; } } }

static void Main(string[] args) { Multime A = new Multime("A"); Multime B = new Multime("B"); Multime C; Punct a = new Punct("a", 4, 0), b = new Punct("b", 2, 3), c = new Punct("c", 5, 0), d = new Punct("d", 6, 9), e = new Punct("e", 1, 3); Punct f = new Punct("f", 4, 9), g = new Punct("g", 2, 1), h = new Punct("h", 7, 6), i = new Punct("i", 1, 3), j = new Punct("j", 9, 2); Console.WriteLine(A.Elemente.Capacity);//citim valoarea pentru Capacity (initial este 0) A.adauga(a); Console.WriteLine(A.Elemente.Capacity);//citim valoarea pentru Capacity (valoarea a crescut automat cand s-a adaugat elementul) A.adauga(b, 3); A.adauga(c, 0); A.adauga(h); A.adauga(d); B.adauga(a); B.adauga(e); B.adauga(f); B.adauga(b); B.adauga(h); B.adauga(i); B.adauga(j); A.scrie(); B.scrie(); C = Multime.reuniune(A, B); C.scrie(); C = Multime.diferenta(A, B); C.scrie(); C.scrie(); Console.WriteLine(A.contine(j)); A.scrie();

Page 6: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 6

A.sorteaza(1); A.scrie(); A.sorteaza(2); A.scrie(); A.sorteaza(3); A.scrie(); }

În urma execuției obținem: 0 4 A={c,a,b,h,d} B={a,e,f,b,h,i,j} AUB={c,a,b,h,d,e,f,i,j} A/B={c,d} A/B={c,d} False A={c,a,b,h,d} A={b,a,c,d,h} A={h,d,c,a,b} A={a,b,c,d,h} Press any key to continue . . .

Observație: Pentru lucrul cu liste de elemente cu tipuri diferite (nu au un tip de bază

comun) se poate folosi clasa ArrayList din spațiul de nume System.Collection. Elementele

acestei clase se utilizează în mod asemănător.

Operaţii de intrare/ieşire

Clasele utilizate pentru operaţiile de intrare/ieşire precum şi clasele utilizate pentru

lucrul cu fişiere şi directoare sunt conţinute de spaţiul de nume System.IO.

Principalele clase din System.IO sunt:

Clasa Descrierea

BinaryReader Citeşte tipurile primitive de date ca valori binare

BinaryWriter Scrie tipurile primitive de date ca valori binare

BufferedStream O clasă flux care memorează într-un buffer citirile şi scrierile

către alt flux

Directory Posedă metode statice pentru lucrul cu directoare

DirectoryInfo Posedă metode non-statice pentru lucrul cu directoare

File Posedă metode statice pentru lucrul cu fişiere

Page 7: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 7

FileInfo Posedă metode non-statice pentru lucrul cu fişiere

FileStream O clasă pentru citirea şi scrierea de fişiere cu ajutorul unui flux

FileSystemInfo Clasă abstractă de bază pentru clasele DirectoryInfo şi FileInfo

FileSystemWatcher Urmăreşte modificările efectuate în sistemul de fişiere

IOException Excepţia generată de clasele din spaţiul de nume System.IO

MemoryStream O clasă flux care efectuează citiri şi scrieri în memorie

Path Permite lucrul cu şiruri de directoare într-o manieră

independentă de platformă

Stream Clasă abstractă de bază pentru toate clasele flux

StreamReader O clasă TextReader care citeşte caractere dintr-un flux de

octeţi

StreamWriter O clasă TextWriter care scrie caractere într-un flux de octeţi

StringReader O clasă TextReader care citeşte dintr-un şir

StringWriter O clasă TextWriter care scrie într-un şir

TextReader Clasă abstractă de bază pentru clasele StreamReader şi

StringReader

TextWriter Clasă abstractă de bază pentru clasele StreamWriter şi

StringWriter

Clasele orientate pe operaţii de intrare/ieşire din spaţiul de nume System.IO pot fi împărţite în trei grupuri:

o Clasele stream, care sunt proiectate pentru intrarea şi ieşirea fluxurilor de octeţi;

o Clasele TextReader şi TextWrite, care sunt utilizate pentru operaţii de intrare/ieşire

în mod caracter;

o Clasele BinaryReader şi BinaryWriter, care sunt utilizate pentru intrarea şi ieşirea

tipurilor primitive, cum ar fi Int32 şi Double, în format binar.

Clasa FileStream

Este utilizată pentru a transfera octeţi într-un fişier. Clasa FileStream are

constructori supraîncărcaţi care permit specificarea următoarelor informaţii:

o Numele fişierului

o Modul de deschidere a fişierului

o Tipul de acces necesar

o Opţiunile de partajare

o Dimensiunea buffer-ului

public FileStream(String, FileMode);

public FileStream(String, FileMode, FileAccess);

public FileStream(String, FileMode, FileAccess, FileShare);

public FileStream(String, FileMode, FileAccess, FileShare, int);

Page 8: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 8

Modul de deschidere al fişierului este reprezentat de membrii enumerării FileMode,

o parte a acestor membri fiind prezentaţi în tabelul următor:

Nume membru Descriere

Append Deschide un fişier existent sau creează un fişier nou şi adaugă

textul la sfârşit

Create Creează un fişier nou sau deschide un fişier existent şi îl

suprascrie

CreateNew Crează un fişier nou şi generează o excepţie dacă fişierul

există deja

Open Deschide un fişier şi lansează excepţia

System.IO.FileNotFoundException dacă fişierul nu există.

Tipul de acces este reprezentat de membrii enumerării FileAccess, prezentaţi în

tabelul următor:

Nume membru Descriere

Read Accesul pentru citire

ReadWrite Accesul pentru citire/scriere

Write Accesul pentru scriere

Opţiunile de partajare sunt specificate de enumerarea FileShare:

Nume membru Descriere

None Fără partajare

Read Accesul pentru citire partajată

ReadWrite Accesul pentru citire/scriere partajată

Write Accesul pentru scriere partajată

Exemplu:

FileStream fs=new

FileStream("fisier.txt",FileMode.Create,FileAccess.ReadWrite,

FileShare.Read);

Observaţie: De obicei, clasa FileStream este utilizată împreună cu alte clase de

scriere/citire, însă se pot utiliza metodele Read şi Write ale acesteia pentru a citi/scrie

octeţii direct.

Page 9: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 9

Clasa TextWriter

Este clasă abstractă de bază pentru un grup de clase (ex.: StreamWriter,

StringWriter) utilizate pentru a scrie caractere. Principalele metode ale clasei sunt:

Metodă Descriere

Close Închide obiectul pentru scriere şi eliberează resursele utilizate

de acesta

Dispose Eliberează resursele utilizate de obiectul pentru scriere

Flush Scrie toate datele memorate în buffer la dispozitivul de bază

Write Scrie textul fără o linie nouă

WriteLine Scrie textul cu o linie nouă

Observaţie: Clasa Console utilizează un obiect TextWriter pentru efectuarea

operaţiilor de ieşire.

Exemplu de utilizare a clasei TextWriter:

try{

// Creăm un FileStream

FileStream fs = new FileStream("iesire.txt", FileMode.Create);

// Creăm un StreamWriter

StreamWriter sw = new StreamWriter(fs);

// Scriem un text

sw.Write("Prima ");

sw.WriteLine(" linie");

sw.WriteLine("A doua linie");

sw.WriteLine("A treia linie");

sw.Flush();

sw.Close();

}

catch(System.Exception pe){

Console.WriteLine(pe.ToString());

}

În fişierul “iesire.txt” vom avea:

Prima linie

A doua linie

A treia linie

Clasa TextReader

Este clasă abstractă de bază pentru un grup de clase (ex.: StreamReader,

StringReader) utilizate pentru a citi caractere. Principalele metode ale clasei sunt:

Page 10: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 10

Metodă Descriere

Close Închide obiectul pentru citire şi eliberează resursele utilizate de

acesta

Dispose Eliberează resursele utilizate de obiectul pentru citire

Peek Returnează următorul caracter de la fluxul de intrare fără să mute

pointerul de fişier

Read Citeşte unul sau mai multe caractere de la fluxul de intrare şi mută

pointerul de fişier

ReadBlock Citeşte un bloc de caractere

ReadLine Citeşte o linie

ReadToEnd Citeşte până la sfârşitul fluxului de intrare

Similar clasei TextWriter, obiectele clasei TextReader interconectează cu obiectele

care acţionează ca sursă de octeţi (ex.: FileStream).

Observaţie: Clasa Console utilizează un obiect TextReader pentru efectuarea

operaţiilor de citire.

Exemplu de utilizare a clasei TextReader pentru citirea linie cu linie:

using System.IO;

static void Main(string[] args) { FileStream fs=null; StreamReader sr=null; try { fs = new FileStream("intrare.txt", FileMode.Open); sr = new StreamReader(fs); int nr = 0; for (; ; ) { String linie = sr.ReadLine(); nr++; if (linie == null) break;//daca s-a citit tot Console.WriteLine(linie); if (nr % 20 == 0) {//afisam câte 20 de linii odata Console.Write("--continuare?--"); String raspuns = Console.ReadLine(); if (raspuns.Equals("Nu")) break; nr = 0; }

Page 11: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 11

} } catch (System.Exception e) { Console.WriteLine("Eroare:\r\n"+e.ToString()); } finally { if(sr!=null)sr.Close(); if (fs != null) fs.Close(); } }

Exemplu de utilizare a clasei TextReader pentru citirea caracter cu caracter:

using System.IO;

static void Main(string[] args) { FileStream fs=null; StreamReader sr = null ; try { fs = new FileStream("intrare.txt", FileMode.Open); sr = new StreamReader(fs); int nr = 0; for (; ; ) { int caracter = sr.Read(); nr++; if (caracter == -1) break;//daca s-a citit tot Console.Write(Convert.ToChar(caracter)); } } catch (System.Exception e) { Console.WriteLine(e.ToString()); } finally { if(sr!=null)sr.Close(); if(fs!=null)fs.Close(); } }

Clasa BinaryWriter

Clasa BinaryWriter scrie tipurile primitive în format binar. Ca şi clasa TextWriter

foloseşte un obiect Stream de bază pentru a pune la dispoziţie un flux de octeţi. Accesul la

acest obiect se face prin intermediul proprietăţii BaseStream. Principalele metode ale clasei

sunt:

Page 12: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 12

Metodă Descriere

Close Închide obiectul pentru scriere şi obiectul Stream de bază

Dispose Eliberează resursele utilizate de obiectul pentru scriere

Flush Scrie toate datele memorate în buffer la dispozitivul de bază

Seek Stabileşte poziţia în cadrul obiectului Stream de bază

Write Scrie o valoare în obiectul Stream

Observaţie: Metoda Write acceptă diferite tipuri de bază. Modul de utilizare al

aceastei metode se va vedea în exeplul de mai jos.

Clasa BinaryReader

Clasa BinaryReader citeşte tipurile primitive în format binar. Ca şi clasa

TextReader foloseşte un obiect Stream de bază pentru a pune la dispoziţie un flux de octeţi.

Accesul la acest obiect se face prin intermediul proprietăţii BaseStream. Principalele

metode ale clasei sunt:

Metodă Descriere

Close Închide obiectul pentru citire şi obiectul Stream de bază

Dispose Eliberează resursele utilizate de obiectul pentru citire

FillBuffer Umple bufferul intern cu un număr de octeţi citiţi de la

fluxul de bază

PeekChar Citeşte următorul caracter dar nu avansează pointerul de

poziţionare

Read Citeşte unul sau mai mulţi octeţi sau caractere de la

obiectul Stream

ReadBoolean Citeşte o valoare de tip Boolean de la obiectul Stream

ReadByte, ReadBytes Citeşte una sau mai multe valori de tip Byte de la obiectul

Stream

ReadChar, ReadChars Citeşte una sau mai multe valori de tip Char de la

obiectul Stream

ReadDecimal Citeşte o valoare de tip Decimal de la obiectul Stream

ReadDouble, ReadSingle Citeşte o valoare în virgulă mobilă cu dublă sau simplă

precizie de la obiectul Stream

ReadInt16, ReadInt32,

ReadInt64

Citeşte o valoare de tip întreg de la obiectul Stream

ReadString Citeşte o valoare de tip String de la obiectul Stream

Page 13: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 13

Observaţie: Spre deosebire de clasa BinaryWriter, clasa BinaryReader pune la

dispoziţie funcţii separate pentru citirea fiecăruia dintre tipurile de bază.

Exemplu de utilizare a claselor BinaryReader şi BinaryWriter pentru citire/scriere în format

binar:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Angajati { class Angajat { String nume, prenume; int anNastere; bool casatorit; double salar; public Angajat(String nume, String prenume, int anNastere, bool casatorit, double salar) { this.nume = nume; this.prenume = prenume; this.anNastere = anNastere; this.casatorit = casatorit; this.salar = salar; } public void scrie(BinaryWriter bw) { bw.Write(nume); bw.Write(prenume); bw.Write(anNastere); bw.Write(casatorit); bw.Write(salar); } public static Angajat citeste(BinaryReader br) { String nume, prenume; int anNastere; bool casatorit; double salar; try { nume = br.ReadString(); prenume = br.ReadString(); anNastere = br.ReadInt32(); casatorit = br.ReadBoolean(); salar = br.ReadDouble(); return new Angajat(nume, prenume, anNastere, casatorit, salar); } catch (Exception) { return null; } } }

Page 14: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 14

class Program { static void Main(string[] args) { List<Angajat> angajati = new List<Angajat>(); angajati.Add(new Angajat("Popescu", "Gheorghe", 1955, true, 1800)); angajati.Add(new Angajat("Sandulescu", "Sandu", 1975, true, 900)); angajati.Add(new Angajat("Georgecu", "Ion", 1962, true, 2800)); //salvam lista de angajati in fisierul angajati.io FileStream fs=null; BinaryWriter bw=null; try { fs = new FileStream("angajati.io", FileMode.Open); bw = new BinaryWriter(fs); bw.Write(angajati.Count);//scriem numarul angajatilor foreach (Angajat a in angajati) a.scrie(bw); } catch (Exception) { Console.WriteLine("Eroare la scriere in fisier."); } finally { if(bw!=null)bw.Close(); if(fs!=null)fs.Close(); } //citim lista angajatilor din fisierul angajati.io angajati.Clear(); BinaryReader br=null; try { fs = new FileStream("angajati.io", FileMode.OpenOrCreate); br = new BinaryReader(fs); int nrAngajati = br.ReadInt32();//citim numarul angajatilor for (int i = 0; i < nrAngajati; i++) angajati.Add(Angajat.citeste(br)); } catch (Exception) { Console.WriteLine("Eroare la citirea din fisier."); } finally { if (bw != null) bw.Close(); if (fs != null) fs.Close(); } } } }

Page 15: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 15

Observaţie: Pentru serializarea / deserializarea datelopr se poate urmări exemplul

prezentat în cadrul laboratorului.

Lucrul cu fişiere şi directoare

Pentru lucrul cu directoare avem clasele Directory şi DirectoryInfo. Ele se

deosebesc prin faptul că în clasa Directory există doar metode statice, în timp ce clasa

DirectoryInfo conţine metode non-statice. Ambele clase sunt utile deoarece:

o metodele statice ale clasei Directory se folosesc pentru verificări înainte de accesul

la un director sau fişier (aceste verificări sunt efectuate la fiecare apel al unei

metode statice, ceea ce poate fi costisitor din punctul de vedere al timpului de

execuţie);

o obiectele din clasa DirectoryInfo lucrează cu un singur director iar verificarea se

face o singură dată, atunci când este construit obiectul, de aceea clasa DirectoryInfo

se utilizează de obicei când se efectuează mai multe operaţii cu un acelaşi director.

Clasa Directory

Principalele metode ale clasei sunt:

Metoda Descriere

CreateDirectory Crează un director

Delete Şterge un director şi, opţional, subdirectoarele acestuia

Exists Verifică dacă există un anumit director

GetCreationTime Dă timpul la care a fost creat directorul

GetCurrentDirectory Dă un string ce reprezintă calea spre directorul curent

GetDirectories Dă un tablou de şiruri reprezentând numele

subdirectoarelor dintr-un director

GetDirectoryRoot Dă rădăcina pentru o cale dată

GetFiles Dă un tablou de şiruri reprezentând numele fişierelor dintr-

un director

GetFileSystemEntries Dă un tablou de şiruri reprezentând numele fişierelor şi

directoarelor dintr-un director dat

GetLastAccessTime Dă timpul la care s-a făcut ultimul acces al directorului

GetLastWriteTime Dă timpul ultimei scrieri pentru un director specificat

GetLogicalDrives Dă o listă cu unităţile logice de pe calculator

GetParent Dă directorul părinte pentru un director specificat

Move Mută un director şi conţinutul acestuia

SetCreationTime Stabileşte timpul de creare a directorului

SetCurrentDirectory Stabileşte directorul curent

Page 16: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 16

SetLastAccessTime Stabileşte timpul ultimului acces pentru director

SetLastWriteTime Stabileşte timpul ultimei scrieri pentru director

Clasa DirectoryInfo

Principalele proprietăţi ale clasei:

Proprietate Descriere

Attributes Dă sau setează obiectul FileAttributes pentru director

CreationTime Dă sau setează timpul la care a fost creat directorul

Exists Dă o valoare care indică dacă există calea directorului

FullName Dă calea completă a directorului

LastAccessTime Dă sau setează timpul ultimei accesări a directorului

LastWriteTime Dă sau setează timpul ultimei scrieri a directorului

Name Dă numele directorului

Parent Dă un obiect DirectoryInfo reprezentând părintele acestui

director

Root Dă un obiect DirectoryInfo reprezentând partea de

rădăcină a unei căi de director

Principalele metode ale clasei sunt:

Metoda Descriere

Create Crează un director

CreateSubdirectory Crează unul sau mai multe subdirectoare

Delete Şterge un director şi conţinutul acestuia

GetDirectories Dă un tablou de obiecte DirectoryInfo reprezentând

subdirectoarele directorului

GetFiles Dă un tablou de obiecte FileInfo reprezentând fişierele

directorului

GetFileSystemInfos Dă un tablou de obiecte FileSystemInfo reprezentând

fişierele şi directoarele directorului

MoveTo Mută directorul şi conţinutul acestuia

ToString Dă calea complet determinată ca un şir de caractere

Page 17: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 17

Pentru lucrul cu fişiere avem clasele File şi FileInfo. Similar claselor Directory şi

DirectoryInfo, clasa File conţine metode statice îar clasa FileInfo conţine metode non-

statice.

Clasa File

Principalele metode ale clasei:

Metoda Descriere

AppendText Adaugă un text unui fişier, creând fişierul dacă acesta nu

există

Copy Copie un fişier

Create Crează un nou fişier

CreateText Crează un nou fişier text

Delete Şterge un fişier

Exists Dă o valoare care indică dacă fişierul există

GetAttributes Dă atributele fişierului

GetCreationTime Dă timpul la care a fost creat fişierul

GetLastAccessTime Dă timpul ultimei accesări a fişierului

GetLastWriteTime Dă timpul la care a fost efectuată ultima scriere în fişier

Move Mută fişierul într-o locaţie nouă, cu opţiunea de a-l redenumi

Open Deschide un obiect FileStream pentru acces de tip

citire/scriere la un fişier

OpenRead Deschide un obiect FileStream pentru acces de tip numai citire

la un fişier

OpenText Deschide un obiect FileStream pentru a citi dintr-un fişier text

OpenWrite Deschide un obiect FileStream pentru acces de tip

citire/scriere la un fişier

SetAttributes Setează atributele fişierului

SetCreationTime Setează timpul la care a fost creat fişierul

SetLastAccessTime Setează timpul ultimei accesări a fişierului

SetLastWriteTime Setează timpul ultimei scrieri în fişier

Clasa FileInfo

Proprietăţile clasei:

Page 18: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 18

Proprietate Descriere

CreationTime Dă sau setează timpul la care a fost creat fișierul

Directory Dă un obiect DirectoryInfo reprezentând directorul părinte al

fişierului

DirectoryName Dă un şir de caractere reprezentănd calea completă a fişierului

Exists Dă o valoare care indică dacă fişierul există

LastAccessTime Dă sau setează timpul ultimei accesări a fișierului

LastWriteTime Dă sau setează timpul ultimei scrieri a fișierului

Length Dă lungimea fişierului în octeţi

Name Dă numele fişierului

Metode ale clasei

Metoda Descriere

AppendText Crează un obiect StreamWriter pentru a adăuga un text la un

fişier

CopyTo Copiază un fişier în altă locaţie

Create Crează un fişier nou şi un obiect FileStream pentru a scrie în el

CreateText Crează un obiect StreamWriter pentru a scrie într-un fişier text

nou

Delete Şterge un fişier

MoveTo Mută un fişier într-o locaţie nouă

Open Returnează un obiect FileStream cu un nivel specificat de acces

la un fişier

OpenRead Returnează un obiect FileStream cu acces pentru citire dintr-un

fişier

OpenText Crează un obiect StreamReader pentru a citi dintr-un fişier

existent

OpenWrite Returnează un obiect FileStream cu acces pentru citire/scriere

dintr-un fişier

ToString Returnează calea fişierului sub forma unui şir

Principalele atribute pentru un fişier sunt

Nume Descriere Valoare

Archive De tip arhivă. 32

Compressed Fişierul este comprimat. 2048

Directory Dacă este director 16

Page 19: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 19

Hidden Dacă este ascuns. 2

Normal Fişier normal, fără atribute

suplimentare

128

ReadOnly Fişier doar pentru citire 1

System Fişier de sistem, fiind utilizat numai

de sistemul de operare.

4

Temporary Fişier temporar. 256

Exemplu

if (!Directory.Exists("D:\\Test\\DirectorNou"))//testam existenta Directory.CreateDirectory("D:\\Test\\DirectorNou");//cream directorul

if (File.Exists("C:\\fisier.txt")) ;//testam existenta fisierul de copiat File.Copy("C:\\fisier.txt", "D:\\Test\\DirectorNou\\fisier1.txt", true);//daca fisierul exista deja il rescrie

Exemplu Funcțiile următoare pot fi utilizate pentru afișarea conținutului unui director (lista

subdirectoarelor și a fișierelor)

static void scrie_continut(DirectoryInfo director, TextWriter sr, String alin) {

sr.WriteLine(alin + "-" + director.Name); alin += " |"; DirectoryInfo[] subdirectoare = director.GetDirectories(); foreach (DirectoryInfo subdir in subdirectoare)

scrie_continut(subdir, sr, alin); FileInfo[] fisiere = director.GetFiles(); foreach (FileInfo fisier in fisiere)

sr.WriteLine(alin + "____" + fisier.Name); } static void scrie(String cale, TextWriter sr) {

if (!Directory.Exists(cale)) {

sr.WriteLine("Cale incorecta!!!"); return; } scrie_continut(new DirectoryInfo(cale), sr, ""); }

Spre exemplu putem avea:

static void Main(string[] args) {

scrie("D:\\Test",Console.Out); }

Page 20: Folosirea colecțiilor de elementemapetrii/POO/depozit/Curs9.pdf · Clasa pune la dispoziție metode pentru căutare, sortare și manipulare a listelor. Un constructor al clasei este

Programare orientată pe obiecte Curs 9

lect. dr. Marius Apetrii 20

Exemplu Detalii despre un fisier pot fi obținute apelând funcția:

void scrie_detalii_fisier(String nume, TextWriter sr) {

if (File.Exists(nume)) {

FileInfo file = new FileInfo(nume); sr.WriteLine("\nDetalii despre fisierul {0}:", file.Name); sr.WriteLine(); sr.WriteLine("Data crearii: {0}", file.CreationTime); sr.WriteLine("Data ultimei modificari: {0}", file.LastWriteTime); sr.WriteLine("Dimensiune fisier: {0} octeti", file.Length); sr.WriteLine("Fisier doar pentru citire: {0}", ((file.Attributes & FileAttributes.ReadOnly) > 0) ? "DA" : "NU"); sr.WriteLine("Fisier ascuns: {0}", ((file.Attributes & FileAttributes.Hidden) > 0) ? "DA" : "NU"); sr.WriteLine("Fisier de sistem: {0}", ((file.Attributes & FileAttributes.System) > 0) ? "DA" : "NU"); sr.WriteLine("Este director: {0}", ((file.Attributes & FileAttributes.Directory) > 0) ? "DA" : "NU"); sr.WriteLine("Fisier de tip arhiva: {0}", ((file.Attributes & FileAttributes.Archive) > 0) ? "DA" : "NU"); sr.WriteLine("Fisier temporar: {0}", ((file.Attributes & FileAttributes.Temporary) > 0) ? "DA" : "NU"); sr.WriteLine("Fisier comprimat: {0}", ((file.Attributes & FileAttributes.Compressed) > 0) ? "DA" : "NU"); } }