C#교과서 마스터하기 46. 스트림과 파일 입출

min seung moon·2021년 7월 16일
0

C#

목록 보기
48/54

https://www.youtube.com/watch?v=rrHDuomZm3M&list=PLO56HZSjrPTB4NxAsEP8HRk6YKBDLbp7m&index=81

1. 스트림과 파일 입출

01. 스트림(Stream)

  • 데이터를 파일/네트워크/데이터베이스 등으로 이동하는(다루는) 메커니즘
  • 읽고 쓰기 가능

02. System.IO Namespace

  • 파일 처리 관련 클래스 제공
    • File, Directory
    • StermReader, StremWriter
    • FileStrem
    • BinaryReader, BinaryWriter
    • ...

03. Sytem.IO.Sterm 추상 클래스

  • Strem
    • FileStrem
    • MemoryStrem
    • NetworkStrem

04. File/Directory 클래스

  • 파일 처리
    • File 클래스
      • File.WriteAllText()
      • File.ReadAllText()
      • 등 등
    • FileInfo 클래스
    • FileStrem 클래스
  • 디렉토리 처리
    • Directory 클래스
    • DirectoryInfo 클래스

05. File 처리 관련 명령어

  • File.Exists
  • File.Create
  • File.Copy
  • File.Move
  • File.Delete

06. Directory 처리관련 명령어

  • Directory.Exists
  • Directory.CreateDirectory
  • Directory.Delete
  • Directory.GetCurrentDirectory
  • Directory.GetFiles
  • Directory.GetDirectories
  • Directory.Move

07. System.IO.Path 클래스

  • 경로 관련 명령어 제공
    • Path.DirectorySeparatorChar
      • \, \ 등을 현재 환경에 맞게 제공

08. System.Xml Namespace

  • XML/XSLT 관련 풍부한 클래스 제공

09. System.Data Namespce

  • System.Data.SqlClient
    • SQL Server 관련된 주요 클래스 제공
  • System.Data
    • 데이터베이스 처리 관련 클래스 및 네임스페이스 제공

2. 프로젝트

  • 45에서 생성한 TodoApp Clone해서 사용

01. 파일 이름 변경 및 Repository 구현 파일을 복사하여 File로 변경

02. 디렉토리에 파일 하나 만들어서 내용 입력해주기

03. 파일 경로 확인


04. 03_02_TodoRepositoryFile 구현

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace CShopTodoApp.Models
{
    public class TodoRepositoryFile : ITodoRepository
    {
        // 파일 경로
        private readonly string _filePath = "";

        // 인-메모리 역할을 해줄 컬렉션 생성
        private static List<Todo> _todos = new List<Todo>();

        public TodoRepositoryFile(string filePath = @"C:\Temp\Todos.txt")
        {
            _filePath = filePath;
            string[] todos = File.ReadAllLines(_filePath, Encoding.Default);
            foreach (var item in todos)
            {
                string[] line = item.Split(',');
                _todos.Add(new Todo { Id = Convert.ToInt32(line[0]), Title = line[1], IsDone = Convert.ToBoolean(line[2]) });
            }
        }

        // 인-메모리 데이터베이스 사용 영역
        public void Add(Todo model)
        {
            model.Id = _todos.Max(t => t.Id) + 1;
            _todos.Add(model);

            // 파일 저장
            string data = "";
            foreach(var t in _todos)
            {
                // \r\n == Environment.NewLine
                data += $"{t.Id},{t.Title},{t.IsDone}{Environment.NewLine}";
            }

            try
            {
                using (StreamWriter sw = new StreamWriter(_filePath))
                {
                    sw.Write(data);
                    sw.Close();  // 파일 닫고
                    // sw.Dispose();  // 메모리 제거
                }
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

        public List<Todo> GetAll()
        {
            return _todos.ToList();
        }
    }

}



05. 실행 프로젝트 만들기(ConsoleApp)

  • UI / CShopTodoApp.ConsoleAppFile
  • 이 후 github에 저장 하거나 말거나
using CShopTodoApp.Models;
using System;
using System.Collections.Generic;

namespace CShopTodoApp.ConsoleAppFile
{
    class Program
    {
        static void Main(string[] args)
        {
            ITodoRepository _repository = new TodoRepositoryFile(@"C:\Temp\Todos.txt");

            List<Todo> todos = new List<Todo>();
            todos = _repository.GetAll();

            // [1] 기본 데이터 출력
            foreach (var t in todos)
            {
                Console.WriteLine($"{t.Id} - {t.Title} ({t.IsDone})");
            }

            // [2] 데이터 입력
            Todo todo = new Todo { Title = "Database", IsDone = true };
            _repository.Add(todo);
            todos = _repository.GetAll();
            // [3] 변경 데이터 출력
            foreach (var t in todos)
            {
                Console.WriteLine($"{t.Id} - {t.Title} ({t.IsDone})");
            }
        }
    }
}


profile
아직까지는 코린이!

0개의 댓글