연습 - 경로 작업

완료됨

.NET Path 클래스와 Directory.GetCurrentDirectory는 파일 시스템 경로를 정의하고 작성하는 두 가지 방법입니다.

이전 연습에서는 폴더를 반복하여 해당 폴더나 하위 폴더에 있는 sales.json 파일을 모두 찾는 프로그램을 작성했습니다.

이 연습에서는 Path 클래스와 Directory.GetCurrentDirectory을(를) 사용하여 .json 확장명을 가진 파일을 모두 찾도록 프로그램을 개선합니다.

현재 디렉터리를 사용하고 경로 결합

현재 Program.cs 코드에서 stores 폴더의 정적 위치를 전달하고 있습니다. 이제 정적 폴더 이름을 전달하는 대신 Directory.GetCurrentDirectory 값을 사용하도록 해당 코드를 변경하겠습니다.

  1. 편집기에서 Program.cs 파일의 첫 번째 줄 위에 다음 코드를 삽입합니다. 이 코드는 Directory.GetCurrentDirectory 메서드를 사용하여 현재 디렉터리의 경로를 가져오고 새 변수 currentDirectory에 저장합니다.

    var currentDirectory = Directory.GetCurrentDirectory();
    
  2. 방금 추가한 줄 뒤에 다음 코드를 삽입합니다. 이 코드는 Path.Combine 메서드를 사용하여 stores 디렉터리의 전체 경로를 만들고 새 변수 storesDirectory에 저장합니다.

    var storesDirectory = Path.Combine(currentDirectory, "stores");
    
  3. FindFiles 함수 호출의 stores 문자열을 새 변수 storesDirectory(으)로 바꿉니다.

    var salesFiles = FindFiles(storesDirectory);
    

    이제 파일의 맨 위는 다음 코드 조각과 유사하게 표시됩니다.

    var currentDirectory = Directory.GetCurrentDirectory();
    var storesDirectory = Path.Combine(currentDirectory, "stores");
    var salesFiles = FindFiles(storesDirectory);
    
    foreach (var file in salesFiles)
    {
        Console.WriteLine(file);
    }
    
  4. Ctrl+S(또는 Cmd+S macOS)를 눌러 파일을 저장합니다.

  5. 명령줄에서 프로그램을 실행합니다.

    dotnet run
    
  6. 프로그램에 다음과 같은 출력이 표시됩니다.

    /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  
    

    반환된 파일 이름에 전체 시스템 경로가 포함되어 있는지 확인합니다. Directory.GetCurrentDirectory 메서드가 현재 위치의 전체 경로를 반환하기 때문에 이 경로가 포함됩니다.

모든 .json 파일 찾기

프로그램에서 sales.json 파일만 찾는 대신 확장명이 .json인 파일을 모두 검색해야 합니다. 이렇게 하려면 Path.GetExtension 메서드를 사용하여 각 파일의 확장명을 확인합니다.

  1. foundFiles을(를) 통해 반복되는 foreach 루프에서 if 문 위에 다음 코드 줄을 삽입하여 새 변수 extension을 정의합니다. 이 코드는 Path.GetExtension 메서드를 사용하여 각 파일의 확장명을 가져옵니다.

        var extension = Path.GetExtension(file);
    
  2. 다음 코드 줄과 같이 if 문을 변경합니다. 이 문은 파일의 확장명이 .json과 같은지 여부를 확인합니다.

           if (extension == ".json")
    

    foreach 루프는 다음 코드와 같이 표시됩니다.

    foreach (var file in foundFiles)
    {
        var extension = Path.GetExtension(file);
        if (extension == ".json")
        {
            salesFiles.Add(file);
        }
    }
    
  3. Ctrl+S / Cmd+S를 눌러 파일을 저장합니다.

  4. 명령줄에서 프로그램을 실행합니다.

    dotnet run
    

    이제 각 매장 ID 디렉터리에 있는 .json 파일이 모두 출력에 표시됩니다.

    /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  
    

잘했습니다. Path 클래스와 Directory.GetCurrentDirectory 메서드를 사용하여 프로그램을 훨씬 더 강력하게 만들었습니다. 다음 단원에서는 디렉터리를 만들고 위치 간에 파일을 이동하는 방법을 알아봅니다.

처리하기 어려운 부분이 있나요?

이 연습을 수행하는 동안 처리하기 어려운 부분이 있었다면 여기서 완성된 코드를 참조하세요. Program.cs의 모든 내용을 제거하고 이 솔루션으로 바꿉니다.

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;
}