연습 - 파일 읽기 및 쓰기

완료됨

.NET의 File 클래스를 사용하여 파일에 데이터를 쓰고 파일에서 데이터를 읽을 수도 있습니다.

Tailwind Traders의 .NET을 만드는 작업을 거의 마쳤습니다. 지금까지 코드는 디렉터리를 읽고 .json 파일을 모두 찾은 다음, totals.txt 파일을 만듭니다.

이 연습에서는 .json 파일을 읽고 매장 합계를 계산한 다음, totals.txt 파일에 총합계를 기록하여 프로젝트를 완료합니다.

프로젝트에 Json.NET 추가

  1. 터미널을 사용하여 프로젝트에 Json.NET을 추가합니다.

    dotnet add package Newtonsoft.Json
    

판매 데이터 준비

  1. Program.cs 위쪽에 using Newtonsoft.Json을 추가합니다.

    using Newtonsoft.Json;
    
  2. Program.cs에서 FindFiles 메서드 바로 아래에 sales.json 데이터를 모델링하는 record를 추가합니다.

    record SalesData (double Total);
    

매출 합계를 계산하는 메서드 만들기

  1. 이전 단계에서 추가한 record 줄 바로 앞에 있는 Program.cs에서 판매 합계를 계산하는 새 함수를 만듭니다. 이 메서드는 반복할 수 있는 파일 경로 IEnumerable<string>을 사용해야 합니다.

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // READ FILES LOOP
    
        return salesTotal;
    }
    
  2. 이 메서드 내에서 // READ FILES LOOP를 특정 루프로 바꿉니다. 이 루프는 salesFiles를 반복하고, 파일을 읽고, 콘텐츠를 JSON으로 구문 분석한 다음, 파일의 total 값을 사용하여 salesTotal 변수를 증분합니다.

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // Loop over each file path in salesFiles
        foreach (var file in salesFiles)
        {      
            // Read the contents of the file
            string salesJson = File.ReadAllText(file);
    
            // Parse the contents as JSON
            SalesData? data = JsonConvert.DeserializeObject<SalesData?>(salesJson);
    
            // Add the amount found in the Total field to the salesTotal variable
            salesTotal += data?.Total ?? 0;
        }
    
        return salesTotal;
    }
    

CalculateSalesTotals 메서드 호출

  1. Program.cs 파일에서 File.WriteAllText 호출 바로 위에 CalculateSalesTotal 함수 호출을 추가합니다.

    var currentDirectory = Directory.GetCurrentDirectory();
    var storesDir = Path.Combine(currentDirectory, "stores");
    
    var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
    Directory.CreateDirectory(salesTotalDir);
    
    var salesFiles = FindFiles(storesDir);
    
    var salesTotal = CalculateSalesTotal(salesFiles); // Add this line of code
    
    File.WriteAllText(Path.Combine(salesTotalDir, "totals.txt"), String.Empty);
    

totals.txt 파일에 합계 쓰기

  1. Program.cs 파일에서 salesTotal 변수 값을 totals.txt 파일에 쓰도록 File.WriteAllText 블록을 수정합니다. 계속해서 이 함수에서 파일을 덮어쓰지 않도록 File.WriteAllText 호출을 File.AppendAllText로 변경합니다.

    var currentDirectory = Directory.GetCurrentDirectory();            
    var storesDir = Path.Combine(currentDirectory, "stores");
    
    var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
    Directory.CreateDirectory(salesTotalDir);            
    
    var salesFiles = FindFiles(storesDir);
    
    var salesTotal = CalculateSalesTotal(salesFiles);
    
    File.AppendAllText(Path.Combine(salesTotalDir, "totals.txt"), $"{salesTotal}{Environment.NewLine}");
    
  2. Ctrl+S / Cmd+S를 눌러 Program.cs 파일을 저장합니다.

프로그램 실행

  1. 터미널에서 프로그램을 실행합니다.

    dotnet run
    

    프로그램의 출력은 없습니다. salesTotalDir/totals.txt 파일을 확인하면 sales.json 파일의 모든 매출 합계를 알 수 있습니다.

  2. 터미널에서 프로그램을 다시 실행합니다.

    dotnet run
    
  3. salesTotalDir/totals.txt 파일을 선택합니다.

    이제 totals.txt 파일에 두 번째 줄이 있습니다. 프로그램을 실행할 때마다 합계가 다시 계산되고 파일에 새 줄이 기록됩니다.

잘했습니다. Tailwind Traders에서 매일 밤, 모든 매장 매출을 처리하는 데 사용할 수 있는 효율적이고 강력하며 편리한 도구를 작성했습니다. 다음 단원에서는 배운 내용을 검토하고 주의해야 할 몇 가지 팁을 살펴보겠습니다.

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

이 연습을 수행하는 동안 처리하기 어려운 부분이 있었다면 여기서 이 프로젝트의 전체 코드를 참조하세요.

using Newtonsoft.Json; 

var currentDirectory = Directory.GetCurrentDirectory();
var storesDirectory = Path.Combine(currentDirectory, "stores");

var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
Directory.CreateDirectory(salesTotalDir);   

var salesFiles = FindFiles(storesDirectory);

var salesTotal = CalculateSalesTotal(salesFiles);

File.AppendAllText(Path.Combine(salesTotalDir, "totals.txt"), $"{salesTotal}{Environment.NewLine}");

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

double CalculateSalesTotal(IEnumerable<string> salesFiles)
{
    double salesTotal = 0;
    
    // Loop over each file path in salesFiles
    foreach (var file in salesFiles)
    {      
        // Read the contents of the file
        string salesJson = File.ReadAllText(file);
    
        // Parse the contents as JSON
        SalesData? data = JsonConvert.DeserializeObject<SalesData?>(salesJson);
    
        // Add the amount found in the Total field to the salesTotal variable
        salesTotal += data?.Total ?? 0;
    }
    
    return salesTotal;
}

record SalesData (double Total);