Poniższy artykuł pochodzi z serii Przygotowań do egzaminu 70-536.
.NET framework zawiera klasy do wykonywania podstawowych zadań związanych z zarządzaniem plikami, folderami, wyszukiwaniem dysków itd. W tej lekcji opiszę najprzydatniejsze klasy związane z działaniem na systemie plików.
Aby wyświetlić listę wszystkich dysków (partycje, Cd-romy, dvd itp.), podłączonych do komputera, należy użyć metody DriveInfo.GetDrivers() (należy użyć przestrzeni System.IO). Przykładowo, poniższy kod wyświetli listę, o której wspominałem wyżej:
1: foreach(DriveInfo di in DriveInfo.GetDrives())
2: {
3: Console.WriteLine("{0} ({1})", di.Name, di.DriveType);
4: }
DriveInfo posiada następujące właściwości:
AvailableFreeSpace – pokazuje dostępną ilość wolnego miejsca na dysku
DriveFormat – pobiera nazwę systemu plików (takich jak FAT32 albo NTFS)
DriveType – typ dysku (w sensie czy cd-rom/dvd czy twardy)
IsReady – sprawdza gotowość dysku
Name – pobiera nazwę dysku
RootDirectory – pobiera katalog główny dysku
TotalFreeSpace – pobiera całkowitą ilość wolnego miejsca na dysku
TotalSize – całkowita wielkość dysku
VolumeLabel – ustawia lub pobiera etykiete woluminu
ZARZĄDZANIE PLIKAMI I FOLDERAMI
PRZEGLĄDANIE FOLDERÓW
Do przeglądania plików i folderów możemy użyć klasy DirectoryInfo. Na początku musimy utworzyć instancję klasy DirectoryInfo, żeby określić folder, który będziemy przeglądać. Następnie wywołujemy metody DirectoryInfo.GetDirectories lub DirectoryInfo.GetFiles.
Poniższy przykład wypisze wszystkie pliki oraz foldery z katalogu C:\Windows
1: DirectoryInfo dir = new DirectoryInfo(@"C:\Windows");
2: Console.WriteLine("Folders: \n");
3: foreach (DirectoryInfo dirInfo in dir.GetDirectories())
4: {
5: Console.WriteLine(dirInfo.Name);
6: }
7: Console.WriteLine("Files: \n");
8: foreach (FileInfo fi in dir.GetFiles())
9: {
10: Console.WriteLine(fi.Name);
11: }
TWORZENIE FOLDERÓW
Aby stworzyć folder, musimy skorzystać z metody DirectoryInfo.Create. Do sprawdzenia czy folder istnieje korzystamy z metody DirectoryInfo.Exists. Poniższy kod sprawdza czy folder istnieje i jeśli nie tworzy go.
1: DirectoryInfo dir = new DirectoryInfo(@"D:\usunmnie");
2: if(dir.Exists)
3: {
4: Console.WriteLine("Istnieje folder o takiej nazwie");
5: }
6: else
7: {
8: dir.Create();
9: }
TWORZENIE, KOPIOWANIE, PRZENOSZENIE ORAZ KASOWANIE PLIKÓW
Do tworzenia, kopiowania, przenoszenia oraz kasowania plików służą metody: File.Create, File.CreateText, File.Copy, File.Move, File.Delete. Poniższy kod tworzy plik, kopiuje go oraz przenosi (tak naprawdę tutaj zmienia nazwę) :
1: File.CreateText("mynewfile.txt");
2: File.Copy("mynewfile.txt","newfile2.txt");
3: File.Move("newfile2.txt","newfile3.txt");
Powyższy kod możemy również zapisać nieco inaczej. Tworzymy instancję klasy FileInfo i wywołujemy metody Create,CreateText,CopyTo, MoveTo oraz Delete. Tak to wygląda w praktyce:
1: FileInfo fi = new FileInfo("mynewfile.txt");
2: fi.CreateText();
3: fi.CopyTo("newfile2.txt");
4: FileInfo fi2 = new FileInfo("newfile2.txt");
5: fi2.MoveTo("newfile3.txt");
MONITOROWANIE PLIKÓW
Możemy używać klasy FileSystemWatcher w odpowiedzi na uaktualnienie plików, stworzenie nowych plików, zmiany nazwy oraz do innych zmian w plikach.
Najpierw tworzymy instancję FileSystemWatcher a następnie ustawiamy właściwości naszej instancji podając czy mają być monitorowane podkatalogi oraz jakie rodzaje zmian chcemy monitorować. Następnie dodajemy metodę jako event handler. Na końcu ustawiamy FileSystemWatcher.EnableRaisingEvent na true. Poniższy kod pokazuje podstawowe użycie FileSystemWatcher. Stworzenie metody do obsługi zdarzenia Changed zostanie opisane później.
1: //tworzymy instancję FileSystemWatcher
2: FileSystemWatcher fsw = new FileSystemWatcher(Environment.GetEnvironmentVariable("USERPROFILE"));
3: //ustawiamy właściwości
4: fsw.IncludeSubdirectories = true;
5: fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
6: //dodajemy nasz event handler
7: fsw.Changed += new FileSystemEventHandler(fsw_Changed);
8: //włączamy monitorowanie
9: fsw.EnableRaisingEvents = true;
Kiedy plik, który spełnia nasze kryteria, zostanie zmieniony, CLR obsłuży zdarzenie ( fsw.Changed += new FileSystemEventHandler(fsw_Changed) ) dla wszystkich zmian, stworzeń czy usunięć. Dla wszystkich plików, których nazwy zostały zmienione, CLR wywoła FileSystemWatcher.Renamed.
W poprzednim przykładzie dodaliśmy metodę fsw_Changed do obsługi zdarzenia Changed. Poniższy kod przedstawia prostą obsługę tego zdarzenia.
1: static void fsw_Changed(object sender, FileSystemEventArgs e)
2: {
3: Console.WriteLine(e.ChangeType + ": " + e.FullPath );
4: }
Parametr FileSystemEventArgs zawiera ścieżkę do zaktualizowanego pliku oraz rodzaj zmian, które w nim wystąpiły.
Jeśli potrzebujemy odpowiedzi na zmianę nazwy pliku, musimy stworzyć event handler’a który przyjmuje parametr RenamedEventArgs zamiast FileSystemEventArgs.
1: static void fsw_Renamed(object sender, RenamedEventArgs e)
2: {
3: Console.WriteLine(e.ChangeType + " from "+ e.OldFullPath +
4: " to "+ e.Name);
5: }
Poniżej wymienione są właściwośći, które ustawiamy w celu określenia, jakie typy aktualizacji mają być obslużone przez zdarzenie Changed.
Filter – używany do konfiguracji nazwy pliku, które uruchamiają zdarzenie. Aby obserować zmiany we wszystkich plikach należy ustawić właściwość Filter na pusty string (””). Aby np. obserwować wszystkie pliki txt należy ustawić właściwość na (”*.txt”)
NotifyFilter– używamy w celu ustawienia jaki typ zmian na pliku ma wywołać
zdarzenie. Możemy ustawić: FileName, DirectoryName, Attributes, Size, LastWrite, LastAcces, CreationTime, Security.
Path – używany do ustawienia ścieżki do folderu, który ma być monitorowany. Możemy go ustawić w konstruktorze FileSystemWatcher.
Kolejny artykuł z serii to 70-536 Reading and Writing Files and Streams