Övning – Arbeta med sökvägar
.NET-klassen Path
och Directory.GetCurrentDirectory
är två sätt att definiera och skapa filsystemsökvägar.
I föregående övning skrev du ett program som itererar via en mapp för att hitta någon av de sales.json filerna i den eller eventuella undermappar.
I den här övningen Path
använder du klassen och Directory.GetCurrentDirectory
för att förbättra programmet så att alla filer med ett .json-tillägg hittas.
Använda den aktuella katalogen och kombinera sökvägar
I den aktuella Program.cs-koden skickar du den statiska platsen för mappen stores. Nu ska vi ändra koden så att den Directory.GetCurrentDirectory
använder värdet i stället för att skicka ett statiskt mappnamn.
I redigeraren infogar du följande kod ovanför den första
Program.cs
raden i filen. Den här koden använderDirectory.GetCurrentDirectory
metoden för att hämta sökvägen för den aktuella katalogen och lagra den i en ny variabelcurrentDirectory
:var currentDirectory = Directory.GetCurrentDirectory();
Infoga följande kod efter raden som du nyss lade till. Den här koden använder
Path.Combine
metoden för att skapa den fullständiga sökvägen till katalogen stores och lagra den i en ny variabelstoresDirectory
:var storesDirectory = Path.Combine(currentDirectory, "stores");
Ersätt strängen
stores
i funktionsanropetFindFiles
med den nya variabelnstoresDirectory
:var salesFiles = FindFiles(storesDirectory);
Överst i filen bör nu se ut ungefär som följande kodfragment:
var currentDirectory = Directory.GetCurrentDirectory(); var storesDirectory = Path.Combine(currentDirectory, "stores"); var salesFiles = FindFiles(storesDirectory); foreach (var file in salesFiles) { Console.WriteLine(file); }
Spara filen genom att trycka på Ctrl+S (eller Cmd+S macOS).
Kör programmet från kommandoraden:
dotnet run
Programmet bör visa följande utdata:
/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
Observera att filnamnen som returneras innehåller den fullständiga systemsökvägen. Den här sökvägen ingår eftersom
Directory.GetCurrentDirectory
metoden returnerar den fullständiga sökvägen till den aktuella platsen.
Hitta alla .json-filer
I stället för att bara leta efter sales.json filer måste programmet söka efter alla filer med ett .json-tillägg. För att göra det kan du använda Path.GetExtension
metoden för att kontrollera tillägget för varje fil.
I loopen
foreach
som itererar genomfoundFiles
infogar du följande kodrad ovanför -instruktionenif
för att definiera en ny variabelextension
. Den här koden använderPath.GetExtension
metoden för att hämta tillägget för varje fil.var extension = Path.GetExtension(file);
Ändra instruktionen
if
så att den ser ut som följande kodrad. Den här instruktionen kontrollerar om filens tillägg är lika med .json.if (extension == ".json")
Loopen
foreach
bör se ut ungefär så här:foreach (var file in foundFiles) { var extension = Path.GetExtension(file); if (extension == ".json") { salesFiles.Add(file); } }
Spara filen genom att trycka på Ctrl+S / Cmd+S.
Kör programmet från kommandoraden:
dotnet run
Utdata visar nu alla .json filer i var och en av butiks-ID-katalogerna:
/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
Bra jobbat! Du har använt klassen Path
och metoden Directory.GetCurrentDirectory
för att göra programmet mer robust. I nästa lektion får du lära dig hur du skapar kataloger och flyttar filer mellan platser.
Har du fastnat?
Här är den färdiga koden om du skulle ha fastnat vid något ställe i övningen. Ta bort allt i Program.cs och ersätt det med den här lösningen:
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;
}