C# 파일 처리 Stream, System.IO

728x90
  • 스트림(Stream)

- 파일, 네트워크 등에서 사용

- File & Directory 클래스

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

namespace _132_File01
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = "";

            if(args.Length <= 0)
            {
                path = Directory.GetCurrentDirectory();
                path += "\\a.txt";

                Console.WriteLine("path : " + path);
            }
            else
            {
                path = args[0];
            }
            if(File.Exists(path))
            {
                Console.WriteLine("\nGetCreationTime : " + File.GetCreationTime(path));
            }
            else
            {
                FileStream fs = File.Create(path);
                fs.Close();
            }
            FileInfo fileInfo = new FileInfo("b.txt");
            FileStream ff = fileInfo.Create();

            ff.Close();
        }
    }
}

 

  • System.IO

- 파일과 데이터 스트림에 읽고 쓸 수 있게 하는 형식

- 기본 파일과 디렉토리 지원을 제공하는 형식

- msdn 참조

 

  • 바이트 입출력

- FileStream, BitConverter

- 데이터 형식을 byte 배열로 변환(BitConverter)

- 사용빈도 낮음

 

  • 텍스트 입출력

- StreamWriter, StreamReader

 

  • 사용자 자료 입출력

- [Serializable] 직렬화

- BinaryFormatter, Serialize, Deserialize

- 사용빈도 높음

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace _135_File_BinaryFormatter
{
    [Serializable]
    struct Player
    {
        public string _Name;
        public int _Level;
        public double _Exp;
    }
    class Program
    {
        const string fileName = "savePlayer.txt";
        static void Main(string[] args)
        {
            Player[] player = new Player[2];

            player[0]._Name = "aaa";
            player[0]._Level = 10;
            player[0]._Exp = 5400;

            player[1]._Name = "bbb";
            player[1]._Level = 99;
            player[1]._Exp = 53460;

            //쓰기
            FileStream fsW = new FileStream(fileName, FileMode.Create);

            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fsW, player);

            fsW.Close();

            //읽기
            FileStream fsR = new FileStream(fileName, FileMode.Open);

            BinaryFormatter bf2 = new BinaryFormatter();
            Player[] readPlayer = (Player[])bf2.Deserialize(fsR);

            for(int i = 0; i < readPlayer.Length; i++)
            {
                Console.WriteLine("Name : " + readPlayer[i]._Name);
                Console.WriteLine("Level : " + readPlayer[i]._Level);
                Console.WriteLine("Exp : " + readPlayer[i]._Exp);
            }

            fsR.Close();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace _136_File_Binaryformatter02
{
    [Serializable]
    struct Player
    {
        public string _Name;
        public int _Level;
        public double _Exp;
    }
    class Program
    {
        const string fileName = "list.dat";
        static void Main(string[] args)
        {
            List<Player> listPlayers = new List<Player>();

            for(int i = 0; i < 10; i++)
            {
                Player player = new Player();
                player._Name = i.ToString();
                player._Level = i;
                player._Exp = i * 10;

                listPlayers.Add(player);
            }

            //쓰기
            FileStream fsw = new FileStream(fileName, FileMode.Create);

            BinaryFormatter bfw = new BinaryFormatter();
            bfw.Serialize(fsw, listPlayers);

            fsw.Close();

            //읽기
            FileStream fsr = new FileStream(fileName, FileMode.Open);

            BinaryFormatter bfr = new BinaryFormatter();
            List<Player> readPlayers = (List<Player>)bfr.Deserialize(fsr);

            foreach(var data in readPlayers)
            {
                Console.WriteLine("_Name : {0} _Level : {1} _Exp : {2}", data._Name, data._Level, data._Exp);
            }

            fsr.Close();
        }
    }
}

 

  • 이진 입출력

- BinaryWriter, BinaryReader

- 모든 기본 데이터 형식에 읽고 쓰기 오버로딩

 

  • CSV데이터 활용

- 게임 데이터 협업

- String.Split 활용

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

namespace _138_File_CSV
{
    class Stage
    {
        public string stage { get; set; }
        public int min { get; set; }
        public int max { get; set; }
        public int finish { get; set; }
        public int gold { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            const string fileName = "test.csv";

            int index = 0;
            List<Stage> listStage = new List<Stage>();

            using(StreamReader sr = new StreamReader(new FileStream(fileName, FileMode.Open)))
            {
                while(false == sr.EndOfStream)
                {
                    string readStr = sr.ReadLine();

                    if(index++ >= 1)
                    {
                        string[] splitData = readStr.Split(',');

                        Stage temp = new Stage();
                        temp.stage = splitData[0];
                        temp.min = Convert.ToInt32(splitData[1]);
                        temp.max = Convert.ToInt32(splitData[2]);
                        temp.finish = Convert.ToInt32(splitData[3]);
                        temp.gold = Convert.ToInt32(splitData[4]);
                        listStage.Add(temp);
                    }
                }
            }
            foreach(var d in listStage)
            {
                Console.WriteLine("{0} {1} {2} {3} {4}", d.stage, d.min, d.max, d.finish, d.gold);
                Console.WriteLine();
            }
            string str = "0, 1, 2, 3, 4, 5";
            string[] splitRead = str.Split(',');
            for(int i = 0; i < splitRead.Length; i++)
            {
                Console.Write("{0}", splitRead[i]);
            }
        }
    }
}
728x90

'게임 프로그래밍 > C#' 카테고리의 다른 글

C# 자료구조 Data Structure  (0) 2021.12.25
C# 스레드 Thread  (0) 2021.12.24
C# LINQ(Select, Oderby, Group, Join)  (0) 2021.12.21
C# 람다식 Ramdba  (0) 2021.12.21
C# 대리자 delegate & 이벤트 event  (0) 2021.12.21