Ćwiczenie — praca ze ścieżkami
Klasa .NET Path
i Directory.GetCurrentDirectory
są dwoma sposobami definiowania i redagowania ścieżek systemu plików.
W poprzednim ćwiczeniu napisałeś program, który iteruje za pośrednictwem folderu, aby znaleźć w nim dowolne pliki sales.json lub wszystkie podfoldery.
W tym ćwiczeniu użyjesz Path
klasy i Directory.GetCurrentDirectory
ulepszysz program, aby znaleźć dowolny plik z rozszerzeniem .json.
Używanie bieżącego katalogu i łączenie ścieżek
W bieżącym kodzie pliku Program.js przekazujesz statyczną lokalizację folderu stores. Teraz zmienimy ten kod tak, aby używał Directory.GetCurrentDirectory
wartości zamiast przekazywać nazwę folderu statycznego.
W edytorze wstaw następujący kod powyżej pierwszego wiersza
Program.cs
pliku. Ten kod używaDirectory.GetCurrentDirectory
metody , aby uzyskać ścieżkę dla bieżącego katalogu i zapisać ją w nowej zmiennejcurrentDirectory
:var currentDirectory = Directory.GetCurrentDirectory();
Wstaw następujący kod po właśnie dodanym wierszu. Ten kod używa
Path.Combine
metody , aby utworzyć pełną ścieżkę do katalogu stores i zapisać ją w nowej zmiennejstoresDirectory
:var storesDirectory = Path.Combine(currentDirectory, "stores");
Zastąp ciąg
stores
w wywołaniuFindFiles
funkcji nową zmiennąstoresDirectory
:var salesFiles = FindFiles(storesDirectory);
Górna część pliku powinna teraz wyglądać podobnie do poniższego fragmentu kodu:
var currentDirectory = Directory.GetCurrentDirectory(); var storesDirectory = Path.Combine(currentDirectory, "stores"); var salesFiles = FindFiles(storesDirectory); foreach (var file in salesFiles) { Console.WriteLine(file); }
Naciśnij Ctrl+S (lub Cmd+S macOS), aby zapisać plik.
Uruchom program z wiersza polecenia:
dotnet run
Program powinien wyświetlić następujące dane wyjściowe:
/home/username/dotnet-files/stores/sales.json /home/username/dotnet-files/stores/201/sales.json /home/username/dotnet-files/stores/202/sales.json /home/username/dotnet-files/stores/203/sales.json /home/username/dotnet-files/stores/204/sales.json
Zwróć uwagę, że zwrócone nazwy plików zawierają pełną ścieżkę systemowa. Ta ścieżka jest uwzględniona, ponieważ
Directory.GetCurrentDirectory
metoda zwraca pełną ścieżkę do bieżącej lokalizacji.
Znajdowanie wszystkich plików JSON
Zamiast wyszukiwać tylko pliki sales.json , program musi wyszukać dowolny plik z rozszerzeniem .json. W tym celu możesz użyć Path.GetExtension
metody , aby sprawdzić rozszerzenie dla każdego pliku.
foreach
W pętli, która iteruje przezfoundFiles
metodę , wstaw następujący wiersz kodu powyżejif
instrukcji , aby zdefiniować nową zmiennąextension
. Ten kod używaPath.GetExtension
metody , aby uzyskać rozszerzenie każdego pliku.var extension = Path.GetExtension(file);
Zmień instrukcję tak
if
, aby wyglądała jak poniższy wiersz kodu. Ta instrukcja sprawdza, czy rozszerzenie pliku jest równe .json.if (extension == ".json")
Pętla
foreach
powinna wyglądać podobnie do następującego kodu:foreach (var file in foundFiles) { var extension = Path.GetExtension(file); if (extension == ".json") { salesFiles.Add(file); } }
Naciśnij Ctrl+S / Cmd+S, aby zapisać plik.
Uruchom program z wiersza polecenia:
dotnet run
Dane wyjściowe zawierają teraz wszystkie pliki .json w każdym z katalogów identyfikatorów sklepu:
/home/username/dotnet-files/stores/sales.json /home/username/dotnet-files/stores/201/sales.json /home/username/dotnet-files/stores/201/salestotals.json /home/username/dotnet-files/stores/202/sales.json /home/username/dotnet-files/stores/202/salestotals.json /home/username/dotnet-files/stores/203/sales.json /home/username/dotnet-files/stores/203/salestotals.json /home/username/dotnet-files/stores/204/sales.json /home/username/dotnet-files/stores/204/salestotals.json
Dobra robota! Użyliśmy klasy Path
i metody Directory.GetCurrentDirectory
, aby program był znacznie bardziej niezawodny. W następnej lekcji dowiesz się, jak tworzyć katalogi i przenosić pliki między lokalizacjami.
Nie wiesz, co zrobić?
Jeśli w którymś miejscu tego ćwiczenia nie wiesz, co robić dalej, oto kompletny kod. Usuń wszystkie elementy w Program.cs i zastąp je następującym rozwiązaniem:
var currentDirectory = Directory.GetCurrentDirectory();
var storesDirectory = Path.Combine(currentDirectory, "stores");
var salesFiles = FindFiles(storesDirectory);
foreach (var file in salesFiles)
{
Console.WriteLine(file);
}
IEnumerable<string> FindFiles(string folderName)
{
List<string> salesFiles = new List<string>();
var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
foreach (var file in foundFiles)
{
var extension = Path.GetExtension(file);
if (extension == ".json")
{
salesFiles.Add(file);
}
}
return salesFiles;
}