Upload
guestca2f46d
View
2.486
Download
1
Embed Size (px)
DESCRIPTION
Citation preview
Wykład II: Wejścia i wyjścia (System.IO)
Karim AghaKarol RogowskiAdam Rafałko
Co dziś omówimy ?
Operacje na plikach używając klas zawartych w System.IO.
Strumienie. Jak używać klas Reader i Writer. Kompresja danych. Isolated Storage. Projekt Grupy PB.NET
Co powinniśmy już umieć ? Utworzyć nowy projekt konsolowy w
Microsoft Visual Studio dla C# lub VB. Dodać referencję do projektu. Utworzyć plik tekstowy.
Nawigacja po systemie plików System.IO zawiera takie klasy które pozwalają na
nawigację i manipulację plików:Klasy Informacyjne (FileInfo, DirectoryInfo)Klasy narzędziowe (File, Directory, Path)
Klasy Informacyjne
Dziedziczą po FileSystemInfo. Klasy te nazywają się:
FileInfoDirectoryInfoDriveInfo*
Służą głównie do pozyskiwania informacji o plikach, katalogach lub dyskach.
Klasy Informacyjne cd.Właściwość Opis
Attributes Zwraca objekt FileAttributes dla danego pliku lub katalogu.
CreationTime Date utworzenia pliku/katalogu.
Exists Informuje o tym czy plik/katalog istnieje.
Extension Rozszerzenie.
FullName Pełna ścieżka do pliku/katalogu.
LastAccessTime Data ostatniego odczytu.
LastWriteTime Data ostatniego zapisu
Name Prosta nazwa: plik: C:\Program Files\PB.NET\plik.txt: ->plik.txt katalog: C:\Program Files\PB.NET\ ->PB.NET
Najważniejsze właściwości klasy FileSystemInfo.
Klasy InformacyjneMetoda Opis
Delete Kasowanie pliku/katalogu.
Refresh Odświerza dane w klasie o pliku/katalogu.
Jak juz mówilismy, po FileSystemInfo, dziedziczą:• FileInfo:
FileInfo jest klasa która pozwala na manipulacje plikiem.
FileInfoWłaściwość Opis
Directory Zwraca DirectoryInfo dla ktalogu w którym znajduję sie plik.
DirectoryName Nazwa katalogu w którym znajduję sie plik
IsReadOnly Sprawdzenie lub przypisanie atrybutu read-only.
Length Rozmiar pliku
FileInfoMetoda Opis
AppendText Tworzy StreamWriter który pozwala na dpisanie tektu do pliku.
CopyTo Tworzy kopie pliku w wybranej lokalizacji
Create Tworzy nowy plik
CreateText Tworzy nowy StreamWriter oraz nowy plik do zapisu.
Encrypt Szyfruje plik danego użytkownika
Decrypt Odszyfruje plik
MoveTo Przenosi plik w nowe miejsce. (Cut-Paste)
Open Otwiera plik z zestawem wybranych uprawnień
OpenRead Otwiera plik tylko do odczytu
OpenText Otwiera plik i zwraca StreamReader pozwalający na odczyt tekstu z pliku.
OpenWrite Otwiera plik tylko do zapisu
Replace Podmienia plik
Jak odczytać informacje o pliku?Aby uzyskać informacje o konkretnym
pliku należy: Utworzyć nowy objekt FileInfo podając
ścieżkę dostępu do pliku. Reszta będzie już w utworzonym
obiekcie.
Przykład:FileInfo ourFile = new FileInfo(@"c:\boot.ini "); if (ourFile.Exists) {
Console.WriteLine("Filename : {0}",ourFile.Name); Console.WriteLine("Path : {0}",ourFile.FullName);
}
Kopiowanie?
FileInfo ourFile = new FileInfo(@"c:\boot.ini");ourFile.CopyTo(@"c:\boot.bak");
DirectoryInfo
Jest to klasa która pozwala na manipulacje katalogiem.
Najważniejsze właściwości:
Właściwość Opis
Parent Zwraca objekt DirectoryInfo dla katalogu który zawiera nasz katalog (rodzica)
Root Zwraca bazowego rodzica (string)
DirectoryInfo
Najważniejsze metody:Metoda Opis
Create Tworzy nowy katalog
CreateSubdirectory Tworzy nowy katalog ktorego rodzicem jest aktualny katalog
GetDirectories Zwraca tablice z katalogami w danym katalogu
GetFiles Zwraca tablice z plikami w danym katalogu
GetFileSysytemInfos Zwraca tablice z objektami FileSystemInfo dla kazdego pliku/katalogu w danym katalogu.
MoveTo Przenosi plik.
Jak przeszukac pliki w katalogu? Tworzymy objekt DirectoryInfo wskazujacy
na katalog który chcemy przeszukać. Wywołujemy metodę GetFiles.Przykład:
DirectoryInfo ourDir = new DirectoryInfo(@"c:\windows");
Console.WriteLine("Directory: {0}", ourDir.FullName);
foreach (FileInfo file in ourDir.GetFiles()) {Console.WriteLine("File: {0}", file.Name);
}
DriveFormat
DriveFormat pozwala na pozyskiwanie onformacji o dyskach.
Właściwość Opis
AvailableFreeSpace Ilość wolnego dostępnego miejsca na dysku.
DriveFormat Zwraca format dysku (NTFS, FAT32, etc..)
DriveType Typ dysku (opisane poźniej)
IsReady Sprawdza czy dysk jest gotowy do odczytu/zapisu
Name Nazwa dysku (literka)
RootDirectory Objekt DirectoryInfo dla tego dysku
TotalFreeSpace Całkowitą wolną powierzchnie na dysku
TotalSize Całkowity rozmiar dysku
VolumeLabel Nazwa dysku
DriveInfo
Metody DriveFormat:GetDrives: metoda statyczna, zwraca
wszystkie dyski w komputerze.
DriveType to enumeracja opisująca typ dysku: CDRom, Fixed, Network, NoRootDirectory, Ram, Removable, Unknown
Jak odczytać dyski?
Wywołać statyczna metoda GetDrives. Iterować przez zwróconą tablice
DriveInfo.
DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo drive in drives)
{ Console.WriteLine("Drive: {0}", drive.Name); Console.WriteLine("Type: {0}", drive.DriveType);
}
Klasa Path Pozwala na manipulacje Ścieżkami Statyczne metody:
ChangeExtension Combine GetDirectoryName GetExtension GetFileName GetFileNameWIthoutExtension GetFillPath GetPathRoot GetRandomFileName GetTempFileName GetTempPath HasExtension IsPathRooted
Jak zmienić rozszerzenie pliku?
string ourPath = @"c:\boot.ini";Console.WriteLine(ourPath); Console.WriteLine("Ext: {0}",
Path.GetExtension(ourPath));Console.WriteLine("Change Path: {0}",
Path.ChangeExtension(ourPath, "bak"));
FileSystemWatcher
Pozwala monitorować system plików. Właściwości:
EnableRisingEventsFilterIncludeSubdirectoriesNotifyFilterPath
Jak monitorować katalog? Otworzyć nowy FileSystemWatcher. Ustalić Path. Zapisać sie do eventów Creader i
Deleted. Włączyć eventy poprzez ustawienie
EnableRisingEvents na true.
Przykład FileSystemWatcherFileSystemWatcher watcher = new
FileSystemWatcher(); watcher.Path = @"c:\"; watcher.Created += new
FileSystemEventHandler(watcher_Changed);
watcher.Deleted += new FileSystemEventHandler(watcher_Changed);
watcher.EnableRaisingEvents = true;
static void watcher_Changed(object sender, FileSystemEventArgs e) { Console.WriteLine("Directory changed({0}): {1}",
e.ChangeType, e.FullPath);
}
Lab:Przeszukiwanie plików i ich monitorowanie. Na tym Lab, przeszukamy pliki i katalogi
w danym katalogu i bedziemy monitorowac czy jakikolwiek z tych plikow lub katalogów zmienił sie.
Strumienie
Jest to sposob na prace z danymi w .NET Framework.
Wszystkie strumienie dziedzicza z abstrakcyjnej klasy Stream.
Klasa stream zawiera właściwości takie jak: CanRead, CanSeek, CanTimeout, CanWrite, Length, Position, ReadTimeout, WriteTimeout.
Strumienie
Klasa Stream posiada metody takie jak: Close, Flush, Read, ReadByte, Seek, SetLength, Write, WriteByte.
Klasy które dziedziczą po klasie Stream to miedzy innymi: FileStream, MemoryStream, CryptoStream, NetworkStream, GZipStream.
Jakie klasy pozwalaja na odczyt i zapis danych ? Wiekszość operacji na plikach zaczyna
sie od klasy File. Klasa File pozwala na:
Operacje zapisu i odczytu calego pliku,Otwieranie, tworzenie plików do odczytu.Otwieranie, tworzenie plików do zapisu.Proste operacje (File.Exists, File.Delete, ...)
Strumienie – File Klasa do strumieniowego zapisu danych na
plikach nazywa sie FileStream. Klasa File posiada podstawowe operacje
do otwierania plików w FileStream do zapisu lub odczytu.
Metody statyczne w File: AppendAllText, AppendText, Copy, Create, CreateText, Move, Open, OpenRead, OpenText, ReadAllBytes, ReadAllLines, ReadAllText, WriteAllBytes, WriteAllLines, WriteAllText.
Strumienie - Directory
Klasa Directory jest klasą statyczną. Posiada metody służące do manipulacji
katalogów takie jak: CreateDirectory, Delete, Exists, GetCreationTime, GetCurrentDirectory, GetDiretiries, GetDirectoryRoot, GetFiles, GetFileSystemEntries
Strumienie
FileAccess, enumeracja która ustala poziom uprawnień potrzebnych do otwarcia pliku. (Read, Write, ReadWrite)
FileMode, enumeracja która ustala jak dany plik ma być otwarty. (Append, Create, CreateNew, Open, OpenOrCreate, Truncate).
FileStream
Klasa FileStream otwiera pliki do zapisu lub odczytu.
Najważniejsze właściwości to te które dziedziczy po Stream w dodawtku do kilka innych takich jak: Handle, Name.
Najważniejsze metody to też te które dziedziczy po Stream w dodatku do: Lock, Unllock.
StreamReader
Klasa StreamReader pozwala na udczyt danych ze Strumienia.
Najważniejsze właściwości to: BaseStream, CurrentEncoding, EndOfStream.
Najważniejsze metody to: Close, Peek, Read, ReadBlock, ReadLine, ReadToEnd.
Jak czytać z pliku ?FileStream theFile = File.Open(@"C:\boot.ini",
FileMode.Open, FileAccess.Read);
Metoda File.Open() zwraca objekt FileStream z otwartym juz plikiem,Jednak używanie klasy FileStream bezposrednio czasem bywa niewygodne.Dlatego warto użyć klasy StreamReader.
StreamReader rdr = new StreamReader(theFile); Console.Write(rdr.ReadToEnd()); rdr.Close(); theFile.Close();
Na skróty:
Console.WriteLine(File.ReadAllText(@"C:\boot.ini"));
StreamWriter
Pozwala na zapisywanie danych w strumieniu.
Najważniejsze właściwości to: AutoFlush, BaseStream, Encoding i NewLine.
Najważniejsze metody to: Close, Write i WriteLine.
StreamWriterStreamWriter writer = new StreamWriter(theFile);writer.WriteLine("Hello"); writer.Close();theFile.Close();
StreamWriter writer =File.CreateText(@"c:\somefile.txt");
writer.WriteLine("Hello"); writer.Close();
Na skróty:File.WriteAllText(@"c:\somefile.txt", "Hello");
AlternatywyStreamWriter writer = new StreamWriter(theFile);
StreamWriter writer =File.CreateText(@"c:\somefile.txt");
File.WriteAllText(@"c:\somefile.txt", "Hello");
theFile = File.Open(@"c:\somefile.txt", FileMode.Open, FileAccess.Write);
theFile = File.OpenWrite(@"c:\somefile.txt");
theFile = File.Open(@"c:\somefile.txt", FileMode.OpenOrCreate, FileAccess.Write);
Reader i Writer
Klasy *Reader i *Writer maja za zadnie
ułatwić czytanie danych strumieniowych.
StreamReader dziedziczy po TextReader a
StreamWriter dziedziczy po TextWriter.
Dane Binarne
Nie wszystkie dane są tekstowe. Do odczytu danych binarnych używamy
BinaryReader. Do zapisu danych binarnych używamy
BinaryWriter.
Dane BinarnePrzykład (zapis):
FileStream newFile = File.Create(@"c:\somefile.bin");
BinaryWriter writer = new BinaryWriter(newFile); long number = 100; byte[] bytes = new byte[] { 10, 20, 50, 100 }; string s = "hunger"; writer.Write(number); writer.Write(bytes); writer.Write(s); writer.Close();
Dane BinarnePrzykład (otczyt):
FileStream newFile = File.Open(@"c:\somefile.bin", FileMode.Open);
BinaryReader reader = new BinaryReader(newFile); long number = reader.ReadInt64(); byte[] bytes = reader.ReadBytes(4); string s = reader.ReadString(); reader.Close(); Console.WriteLine(number); foreach (byte b in bytes)
Console.Write("[{0}]", b); Console.WriteLine(); Console.WriteLine(s);
Inne typy strumieni
MemoryStream – zapis i odczyt bezposrednio do pamięci RAM.
BufferedStream – poprawia czasem wydajność zapisu strumieni poprzez buforowanie danych.
Kompresja danych
W .NET Framework, kompresja danych opiera się o Strumienie Kompresujące.
Strumienie kompresujące to: GZipStream i DeflateStream.
Dane które będziemy kompresować są limitowane do 4 GB.
GZipStream
Klasa GZipStream pozwala na kompresję danych znajdujących się w innym strumieniu używając metody GZIP.
GZipStream dziedziczy po Stream.
DeflateStream
Pozwala na kompresję danych używając metody Deflate.
Również bazuję na Stream.
Jak kompresować dane?Kompresja w .NET bazuję na strumieniach, są to jednak innego
typu strumienie niż omawiane do tej pory. Strumienie kompresujące zapisuja skompresowane dane do innych strumieni.
Przykład:
FileStream sourceFile = File.OpenRead(inFilename);FileStream destFile = File.Create(outFilename); GZipStream compStream = new GZipStream(destFile,
CompressionMode.Compress);int theByte = sourceFile.ReadByte(); while (theByte != -1)
{ compStream.WriteByte((byte)theByte); theByte = sourceFile.ReadByte(); }
Isolated Storage
Co to jest Isolated Storage? Klasa IsolatedStorageFile Rodzaje Isolated Storage Klasa IsolatedStorageFileStream
Jak tworzyć Isolated Storage? Zdecydować jaki typ IS potrzebujemy.
IsolatedStorageFile machineStorage = IsolatedStorageFile.GetMachineStoreForAssembly();
IsolatedStorageFile userStorage = IsolatedStorageFile.GetUserStoreForAssembly();
Czytanie i zapis do ISIsolatedStorageFile userStore =
IsolatedStorageFile.GetUserStoreForAssembly();
IsolatedStorageFileStream userStream = new IsolatedStorageFileStream("UserSettings.set", FileMode.Create, userStore);
StreamWriter userWriter = new StreamWriter(userStream);
userWriter.WriteLine("User Prefs");userWriter.Close();
IsolatedStorageFileStream userStream = new IsolatedStorageFileStream("UserSettings.set", FileMode.Open, userStore);