연습 - 파일 읽기 및 쓰기
.NET의 File
클래스를 사용하여 파일에 데이터를 쓰고 파일에서 데이터를 읽을 수도 있습니다.
Tailwind Traders의 .NET을 만드는 작업을 거의 마쳤습니다. 지금까지 코드는 디렉터리를 읽고 .json 파일을 모두 찾은 다음, totals.txt 파일을 만듭니다.
이 연습에서는 .json 파일을 읽고 매장 합계를 계산한 다음, totals.txt 파일에 총합계를 기록하여 프로젝트를 완료합니다.
프로젝트에 Json.NET 추가
터미널을 사용하여 프로젝트에 Json.NET을 추가합니다.
dotnet add package Newtonsoft.Json
판매 데이터 준비
Program.cs
위쪽에using Newtonsoft.Json
을 추가합니다.using Newtonsoft.Json;
Program.cs
에서FindFiles
메서드 바로 아래에 sales.json 데이터를 모델링하는 새record
를 추가합니다.record SalesData (double Total);
매출 합계를 계산하는 메서드 만들기
이전 단계에서 추가한
record
줄 바로 앞에 있는Program.cs
에서 판매 합계를 계산하는 새 함수를 만듭니다. 이 메서드는 반복할 수 있는 파일 경로IEnumerable<string>
을 사용해야 합니다.double CalculateSalesTotal(IEnumerable<string> salesFiles) { double salesTotal = 0; // READ FILES LOOP return salesTotal; }
이 메서드 내에서
// 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 메서드 호출
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 파일에 합계 쓰기
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}");
Ctrl+S / Cmd+S를 눌러 Program.cs 파일을 저장합니다.
프로그램 실행
터미널에서 프로그램을 실행합니다.
dotnet run
프로그램의 출력은 없습니다. salesTotalDir/totals.txt 파일을 확인하면 sales.json 파일의 모든 매출 합계를 알 수 있습니다.
터미널에서 프로그램을 다시 실행합니다.
dotnet run
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);