연습 - 파일 시스템 작업

완료됨

.NET을 사용하여 파일 및 폴더에 대한 정보를 찾아서 반환할 수 있습니다.

Tailwind Traders는 전 세계에 많은 오프라인 매장이 있습니다. 매일 밤 각 매장은 해당 날의 모든 판매 합계를 포함하는 sales.json이라는 파일을 만듭니다. 해당 파일은 매장 ID로 명명된 폴더에 구성됩니다.

참고 항목

이 모듈에서는 로컬 개발에 .NET CLI(명령줄 인터페이스)Visual Studio Code를 사용합니다. 이 모듈을 마치면 Visual Studio(Windows), Mac용 Visual Studio(macOS) 또는 Visual Studio Code(Windows, Linux 및 macOS)의 연속 개발 등의 개발 환경을 사용하여 학습한 개념을 적용할 수 있습니다.

이 모듈에서는 .NET 8.0 SDK를 사용합니다. 기본 설정 터미널에서 다음 명령을 실행하여 .NET 8.0이 설치되어 있는지 확인합니다.

dotnet --list-sdks

다음 예제와 유사한 출력이 표시됩니다.

6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]

8으로 시작하는 버전이 나열되어 있는지 확인합니다. 나열되는 버전이 없거나 명령을 찾을 수 없는 경우 최신 .NET 8.0 SDK를 설치합니다.

프로젝트 복제

이 연습에서는 디렉터리와 해당 하위 디렉터리에서 sales.json이라는 파일을 검색하는 .NET 프로그램을 작성합니다.

시작 프로젝트가 이미 생성되었습니다. Visual Studio Code에서 통합 터미널을 사용하여 복제합니다.

  1. Visual Studio Code를 엽니다.

  2. 주 메뉴에서 보기>터미널을 선택하여 터미널 창을 엽니다.

  3. (선택 사항) 터미널 창에서 파일을 복사할 디렉터리(예: c:\MyProjects)로 변경합니다.

  4. 터미널 창에서 다음 명령을 실행하여 시작 프로젝트를 복제하고 복제된 프로젝트로 이동합니다.

    git clone https://github.com/MicrosoftDocs/mslearn-dotnet-files && cd mslearn-dotnet-files
    
  5. 다음 명령을 실행하여 새 .NET 콘솔 프로젝트를 만듭니다.

    dotnet new console -f net8.0 -n mslearn-dotnet-files -o .
    
  6. 다음 명령을 실행하여 Visual Studio Code의 동일한 인스턴스에서 새 .NET 프로젝트를 엽니다.

    code -a .
    

    이때 Visual Studio Code는 프로젝트를 빌드하고 실행하는 데 필요한 자산이 누락되었다는 메시지를 표시합니다.

    프로젝트에서 어떤 것이 누락되었음을 사용자에게 알리는 Visual Studio 프롬프트를 보여 주는 스크린샷

    느낌표가 있는 삼각형을 선택하고 터미널 다시 시작을 선택하여 Visual Studio Code에서 프로젝트를 실행하고 디버그할 수 있도록 허용하는 파일을 추가합니다.

  7. 탐색기 창에서 mslearn-dotnet-files 아래에 있는 stores 폴더와 번호가 매겨진 각 폴더를 확장합니다.

    프로젝트 폴더 구조를 보여 주는 탐색기 창의 스크린샷.

sales.json 파일 찾기

다음 작업은 mslearn-dotnet-files 프로젝트의 모든 폴더에서 모든 sales.json 파일을 찾는 프로그램을 만듭니다.

System.IO 네임스페이스 포함

  1. 탐색기 창에서 Program.cs 파일을 선택하여 편집기에서 엽니다.

    program.cs 파일을 강조 표시하는 탐색기 창의 스크린샷

  2. 다음 코드를 Program.cs 파일의 첫 번째 줄에 붙여넣어 System.IOSystem.Collections.Generic 네임스페이스를 가져옵니다.

    using System.IO;
    using System.Collections.Generic;
    

참고 항목

.NET 6부터 이전 코드의 두 문이 ImplcitUsings 속성 그룹을 통해 새 프로젝트에 자동으로 포함됩니다. 새 콘솔 프로젝트를 만들 때 -f net8.0 플래그를 지정했으므로 암시적으로 추가됩니다. 그러나 이전 프로젝트로 작업하는 경우 Program.cs 파일에 포함해야 하며 파일에 남겨둔 경우에는 이 프로젝트에 영향을 주지 않습니다.

sales.json 파일을 찾는 함수 작성

folderName 매개 변수를 사용하는 FindFiles라는 새 함수를 만듭니다.

  1. Console.WriteLine(“Hello, World!”); 줄을 다음 코드로 바꿉니다.

    IEnumerable<string> FindFiles(string folderName)
    {
        List<string> salesFiles = new List<string>();
    
        var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
    
        foreach (var file in foundFiles)
        {
            // The file name will contain the full path, so only check the end of it
            if (file.EndsWith("sales.json"))
            {
                salesFiles.Add(file);
            }
        }
    
        return salesFiles;
    }
    
  2. using 문 아래에 다음 코드를 삽입하여 FindFiles 함수를 호출합니다. 이 코드는 파일을 검색할 위치로 stores 폴더 이름을 전달합니다.

    var salesFiles = FindFiles("stores");
    
    foreach (var file in salesFiles)
    {
        Console.WriteLine(file);
    }
    
  3. Ctrl+S(또는 Cmd+S macOS)를 눌러 Program.cs 파일을 저장합니다.

프로그램 실행

  1. 프로그램을 실행하려면 터미널 창에서 다음 명령을 입력합니다.

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

    stores/sales.json
    stores/201/sales.json
    stores/202/sales.json
    stores/203/sales.json
    stores/204/sales.json
    

아주 좋습니다! stores 디렉터리의 모든 폴더를 트래버스하고 발견된 모든 sales.json 파일을 나열하는 명령줄 프로그램을 성공적으로 작성했습니다.

이 예제에서 stores 디렉터리의 경로는 다소 간단하며, 프로그램의 작업 디렉터리 내에 있습니다. 다음 단원에서는 Path 클래스를 사용하여 여러 운영 체제에서 작동하는 복잡한 구조를 생성하는 방법을 알아봅니다.

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

프로그램을 실행하는 데 문제가 있는 경우 Program.cs 파일에 대한 완성된 코드는 다음과 같습니다. Program.cs 파일의 내용을 다음 코드로 바꿉니다.

var salesFiles = FindFiles("stores");
    
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)
    {
        // The file name will contain the full path, so only check the end of it
        if (file.EndsWith("sales.json"))
        {
            salesFiles.Add(file);
        }
    }

    return salesFiles;
}