C# 파일 읽기 및 쓰기
C#에서의 파일 입출력(I/O) 작업은 많은 소프트웨어 애플리케이션에서 필수적인 부분으로, 개발자가 파일을 효율적으로 읽고 쓸 수 있도록 해줍니다. 데이터를 저장하든, 애플리케이션 이벤트를 기록하든, 대량의 텍스트 또는 바이너리 데이터를 처리하든, C#은 파일 작업을 위한 강력한 도구를 제공합니다. Tim Corey의 비디오 " C# 데이터 액세스: 텍스트 파일 "에서 그는 텍스트 파일을 데이터 저장 및 검색에 사용하는 방법을 중심으로 이러한 파일 작업에 대한 자세한 설명을 제공합니다. 이 글은 Tim이 영상에서 다룬 핵심 개념과 기법을 요약하여 C#에서의 파일 입출력 작업에 대한 실질적인 통찰력을 제공하는 것을 목표로 합니다.
소개
C#에서 파일 입출력 작업은 텍스트 파일에서 읽고 쓰는 데 필수적입니다. 클래스 File는 기존 파일과 상호작용하거나 새 파일을 생성하기 위한 정적 메서드를 제공합니다. StreamReader와 StreamWriter는 파일 읽기와 쓰기에 일반적으로 사용됩니다. StreamReader는 파일을 한 줄씩 읽어 텍스트의 각 줄이나 문자열 배열에 접근할 수 있게 합니다. 더 큰 파일을 효율적으로 읽기 위해 while 루프를 사용할 수도 있습니다. 클래스 StreamWriter는 문자열 및 배열의 쓰기를 지원하면서 파일에 데이터를 쓰는 데 사용됩니다. 기존 파일에 텍스트를 추가하거나 전체 파일을 덮어쓸 수 있습니다. WriteLine 및 WriteText와 같은 메서드를 통해 텍스트 파일 내에서 데이터를 쉽게 조작할 수 있습니다.
대개 이러한 작업은 파일 경로를 정의하는 static void Main 메서드 내에서 수행됩니다. 예를 들어 파일 이름을 지정하고 StreamWriter을 사용하여 단일 문자열이나 전체 문자열 배열을 쓸 수 있습니다. 문 using는 작업 후 파일이 제대로 닫혀 리소스 누수가 발생하지 않도록 보장합니다. StreamReader는 또한 파일을 한 줄씩 읽는 데 사용할 수 있으며, 파일이 존재하지 않거나 접근할 수 없는 경우 발생할 수 있는 잠재적인 오류를 관리하기 위해 예외를 처리할 수 있습니다. 이러한 파일 입출력 기능 덕분에 C#은 파일을 효율적이고 효과적으로 다루는 데 탁월한 선택입니다.
Tim은 C#에서 텍스트 파일을 읽고 쓰는 것이 얼마나 간단한지를 강조하면서 주제를 소개합니다. 그는 몇 줄의 코드로 이러한 작업들을 수행할 수 있음을 보여주며, 텍스트 파일이 데이터 저장에 실용적인 선택지가 될 수 있음을 입증합니다.
데모 콘솔 애플리케이션 만들기
Tim은 Visual Studio를 사용하여 "TextFileDataAccessDemo"라는 이름의 새 콘솔 애플리케이션을 만드는 것으로 시작합니다.
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
namespace TextFileDataAccessDemo
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine(); // Keeps the console window open to view the output
}
}
}using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
namespace TextFileDataAccessDemo
{
class Program
{
static void Main(string[] args)
{
Console.ReadLine(); // Keeps the console window open to view the output
}
}
}그는 콘솔 창이 열려 있도록 하여 사용자가 출력을 볼 수 있게 하기 위해 Console.ReadLine의 사용을 설명합니다.
텍스트 파일에서 읽기
팀은 File.ReadAllLines 메서드를 사용하여 텍스트 파일에서 읽는 방법을 시연합니다. 그는 파일 경로를 처리하는 방법과 이스케이프 문자를 피하기 위해 문자열 리터럴을 사용하는 방법을 보여줍니다.
string filePath = @"C:\demos\test.txt";
List<string> lines = File.ReadAllLines(filePath).ToList();string filePath = @"C:\demos\test.txt";
List<string> lines = File.ReadAllLines(filePath).ToList();메서드 File.ReadAllLines는 지정된 파일의 모든 줄을 읽어 문자열 배열로 반환합니다. 팀은 조작을 쉽게 하기 위해 이 배열을 리스트로 변환합니다.
텍스트 파일에 쓰기
팀은 File.WriteAllLines 메서드를 사용하여 텍스트 파일에 데이터를 쓰는 방법을 설명합니다. 그는 목록에 새 줄을 추가하고 업데이트된 목록을 파일에 다시 쓰는 방법을 보여줍니다.
lines.Add("Sue,Storm,WWIStorm.com");
File.WriteAllLines(filePath, lines);lines.Add("Sue,Storm,WWIStorm.com");
File.WriteAllLines(filePath, lines);이 코드는 목록에 새 항목을 추가하고 전체 목록을 파일에 다시 저장합니다.
데이터 모델을 생성하고 파일에서 데이터를 가져와 채우는 방법
팀은 텍스트 파일의 각 항목에 대한 데이터 구조를 나타내기 위해 Person 클래스를 만듭니다.
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string URL { get; set; }
}public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string URL { get; set; }
}그 후, 그는 파일을 읽고 Person 객체의 목록을 채웁니다.
List<Person> people = new List<Person>();
List<string> lines = File.ReadAllLines(filePath).ToList();
foreach (string line in lines)
{
string[] entries = line.Split(',');
Person newPerson = new Person
{
FirstName = entries[0],
LastName = entries[1],
URL = entries[2]
};
people.Add(newPerson);
}List<Person> people = new List<Person>();
List<string> lines = File.ReadAllLines(filePath).ToList();
foreach (string line in lines)
{
string[] entries = line.Split(',');
Person newPerson = new Person
{
FirstName = entries[0],
LastName = entries[1],
URL = entries[2]
};
people.Add(newPerson);
}이 코드는 각 줄을 읽고, 콤마로 나눈 후 추출된 데이터로 Person 객체를 생성합니다.
문자열 보간
Tim은 C# 6.0의 기능인 문자열 보간을 소개합니다. 이 기능은 변수와 문자열을 결합하는 과정을 간소화합니다. 이 방법은 문자열 앞에 $ 기호와 중괄호 {}를 사용하여 변수를 문자열 내에서 직접 포함합니다.
foreach (var person in people)
{
Console.WriteLine($"{person.FirstName} {person.LastName}: {person.URL}");
}foreach (var person in people)
{
Console.WriteLine($"{person.FirstName} {person.LastName}: {person.URL}");
}이 문법은 기존의 + 연산자를 사용하는 문자열 연결에 비해 더 간결하고 효율적입니다.

데이터 유효성 검사
팀은 텍스트 파일에서 데이터를 읽을 때 데이터 유효성 검사의 중요성을 강조합니다. 그는 데이터 구조를 추측하는 것의 위험성을 지적하고 분할된 항목의 길이를 확인하는 것을 권장합니다.
foreach (string line in lines)
{
string[] entries = line.Split(',');
if (entries.Length == 3)
{
Person newPerson = new Person
{
FirstName = entries[0],
LastName = entries[1],
URL = entries[2]
};
people.Add(newPerson);
}
else
{
// Handle error
Console.WriteLine("Invalid data format.");
}
}foreach (string line in lines)
{
string[] entries = line.Split(',');
if (entries.Length == 3)
{
Person newPerson = new Person
{
FirstName = entries[0],
LastName = entries[1],
URL = entries[2]
};
people.Add(newPerson);
}
else
{
// Handle error
Console.WriteLine("Invalid data format.");
}
}이렇게 하면 항목 수가 올바른 줄만 처리되므로 잠재적인 런타임 오류를 방지할 수 있습니다.
리스트에 객체 추가하기
팀은 목록에 새 객체를 추가하는 방법을 시연합니다. 리스트에 새로운 사람을 추가하기 위해 Person 클래스의 익명 인스턴스를 사용합니다.
people.Add(new Person { FirstName = "Greg", LastName = "Jones", URL = "WOWT.com" });people.Add(new Person { FirstName = "Greg", LastName = "Jones", URL = "WOWT.com" });이는 한 줄에서 새로운 Person 객체를 생성 및 초기화하여 people 리스트에 추가됩니다.
데이터를 텍스트 파일에 다시 쓰는 방법
팀은 Person 객체의 목록을 텍스트 파일로 다시 쓰는 방법을 설명합니다. 그는 Person 객체 목록을 문자열 목록으로 변환하며, 각 문자열은 파일의 줄을 나타냅니다.
List<string> output = new List<string>();
foreach (var person in people)
{
output.Add($"{person.FirstName},{person.LastName},{person.URL}");
}
File.WriteAllLines(filePath, output);List<string> output = new List<string>();
foreach (var person in people)
{
output.Add($"{person.FirstName},{person.LastName},{person.URL}");
}
File.WriteAllLines(filePath, output);이 코드는 people 목록을 반복하여 각 Person 객체에 대한 CSV 문자열을 생성하고 문자열 목록을 파일에 씁니다.
결론
Tim Corey의 C# 파일 입출력 작업에 대한 자세한 가이드는 텍스트 파일 읽기 및 쓰기에 대한 실질적인 정보를 제공합니다. 그의 사례를 따르면 개발자들은 텍스트 파일을 사용하여 데이터를 효과적으로 관리하고 견고한 데이터 저장 솔루션을 구현할 수 있습니다. 심층적인 이해와 실질적인 학습 경험을 위해, 팀 코리의 영상을 시청하시기를 강력히 추천합니다. 그는 실제 사례를 통해 이러한 개념들을 더욱 자세히 설명합니다.

