C#教科書を身につける.ストリームとファイルの入力

6282 ワード

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.Stem抽象クラス

  • Strem
  • FileStrem
  • MemoryStrem
  • NetworkStrem
  • 04.ファイル/ディレクトリクラス

  • ファイル処理
  • ファイルクラス
  • File.WriteAllText()
  • File.ReadAllText()
  • FileInfoクラス
  • FileStremクラス
  • 処理
  • ディレクトリ
  • ディレクトリクラス
  • DirectoryInfoクラス
  • 05.ファイル処理命令

  • File.Exists
  • File.Create
  • File.Copy
  • File.Move
  • File.Delete
  • 06.ディレクトリ処理命令

  • 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インプリメンテーションファイルをファイルにコピーする



    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.実行項目の作成

  • UI/CShopTodoApp.ConsoleAppFile
  • hugithubに格納されているかどうか
  • 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})");
                }
            }
        }
    }