midas+son의 크리에이티브(creative) 이야기

//파일 로드 - FileStream, StreamReader, ReadAllText, ReadAllLines

//이전 글 - 파일 저장과 대입되는 4가지 방법 이다.


        private string loadData;    //로드한 데이터를 담을 변수

//디렉터리 경로 지정

        private const string path = "./save/test1/";   //요즘 많이 사용하는 방법 /

        private const string path2 = ".\\save\\test2"; //옛날부터 디렉터리 구분하는 방법 \\

        private const string path3 = @".\save\test3"; //@뒤에 있는 string은 디렉터리를 표시하는 것이라고 지정 - 최신


        private void PrintLoadData()

        {

            Console.WriteLine("읽은 데이터는 다음과 같습니다.");

            Console.WriteLine("{0}\n", loadData);

        }


        //로드

        //1. FileStream

        public void LoadFromFileStream(string fileName = "S_FileString.txt")

        {

            string fullpath = path + "/" + fileName;    //그냥 쉽게 하려고 쓴것이다. 성능은 StringBuilder이 좋다. 


            try

            {

//파일 스트림 생성. cs파일 상단에 using System.IO; 추가

                FileStream fs = new FileStream(

                    fullpath,

                    FileMode.Open,

                    FileAccess.Read);


//바이트 단위로 로드

                byte[] bytes = new byte[fs.Length];

                fs.Read(bytes, 0, bytes.Length);

                loadData = Encoding.UTF8.GetString(bytes);

                fs.Close();

            }

                //파일 못찾음

            catch (FileNotFoundException)   //변수 없어도 됨

            {

                Console.WriteLine("파일을 찾지 못했습니다.");

                return;

            }

                //디렉터리 못찾음

            catch(DirectoryNotFoundException)

            {

                Console.WriteLine("폴더가 없습니다.");

                return;

            }

            catch (Exception e)

            {

                Console.WriteLine(e);

            }


            Console.WriteLine("로딩 완료 LoadFromFileStream");

            PrintLoadData();


        }


        //2. StreamReader

        public void LoadFromStreamReader(string fileName = "S_StreamWriter.txt")

        {

            string fullpath = path2 + "/" + fileName;


            try

            {

                FileStream fs = new FileStream(

                    fullpath,

                    FileMode.Open,

                    FileAccess.Read);


                StreamReader sr = new StreamReader(fs);    //스트림 생성


                string line;

                StringBuilder builder = new StringBuilder();


                while((line = sr.ReadLine()) != null)    //한줄 읽는데 null이 아니면

                {

                    builder.Append(line);    //한줄 저장

                    builder.Append("\n");    //개행

                }

                loadData = builder.ToString();


                sr.Close();

                fs.Close();

            }

            //파일 못찾음

            catch (FileNotFoundException)   //변수 없어도 됨

            {

                Console.WriteLine("파일을 찾지 못했습니다.");

                return;

            }

            //디렉터리 못찾음

            catch (DirectoryNotFoundException)

            {

                Console.WriteLine("폴더가 없습니다.");

                return;

            }

            catch (Exception e)

            {

                Console.WriteLine(e);

            }


            Console.WriteLine("로딩 완료 LoadFromStreamReader");

            PrintLoadData();


        }


        //3. ReadAllText

        public void LoadFromReadAllText(string fileName = "S_WriteAllText.txt")

        {

            string fullpath = path3 + "/" + fileName;


            try

            {

                loadData = File.ReadAllText(fullpath);    //걍 모두 저장. 한줄이라 참쉽다.

            }

            //파일 못찾음

            catch (FileNotFoundException)   //변수 없어도 됨

            {

                Console.WriteLine("파일을 찾지 못했습니다.");

                return;

            }

            //디렉터리 못찾음

            catch (DirectoryNotFoundException)

            {

                Console.WriteLine("폴더가 없습니다.");

                return;

            }

            catch (Exception e)

            {

                Console.WriteLine(e);

            }


            Console.WriteLine("로딩 완료 LoadFromReadAllText");

            PrintLoadData();


        }


        //4. ReadAllLines

        public void LoadFromReadAllLines(string fileName = "S_WriteAllLines.txt")

        {

            string fullpath = path2 + "/" + fileName;


            try

            {

                string[] lines = File.ReadAllLines(fullpath);    //라인별로 string 배열에 저장

                StringBuilder builder = new StringBuilder(lines.Length);    //스트링 변수의 크기를 알고 있으면 선언해주는게 좋다

                foreach(var line in lines)

                {

                    builder.Append(line);

                    builder.Append("\n");

                }

                loadData = builder.ToString();

            }

            //파일 못찾음

            catch (FileNotFoundException)   //변수 없어도 됨

            {

                Console.WriteLine("파일을 찾지 못했습니다.");

                return;

            }

            //디렉터리 못찾음

            catch (DirectoryNotFoundException)

            {

                Console.WriteLine("폴더가 없습니다.");

                return;

            }

            catch (Exception e)

            {

                Console.WriteLine(e);

            }


            Console.WriteLine("로딩 완료 LoadFromReadAllLines");

            PrintLoadData();


        }



//파일 저장 - FileStream, StreamWriter, WriteAllText, WriteAllLines

//4가지 방법

//string 1줄

        private string saveData = "1.테스트\n2.진행중\r\n3.입니다.";

//\n 개행 \r 캐리지리턴 - 시스템마다 개행을 나타내는 문자가 달라서 적음 \r


//string배열

        private string[] saveData2 = { "1.테스트", "2.진행중", "3.입니다." };


//디렉터리(폴더) 경로 지정

        private const string path = "./save/test1/";   //요즘 많이 사용하는 방법 /

        private const string path2 = ".\\save\\test2"; //옛날부터 디렉터리 구분하는 방법 \\

        private const string path3 = @".\save\test3"; //@뒤에 있는 string은 디렉터리를 표시하는 것이라고 지정 - 최신


//1.FileStream

        public void SaveByFileStream(string fileName = "S_FileString.txt")

        {

            StringBuilder fullPath = new StringBuilder();

            fullPath.Append(path);

            fullPath.Append("/");

            fullPath.Append(fileName);

            //string fullPath = path + "/" + fileName;


            try

            {

            //상단에 using System.IO; 추가

            FileStream fs = new FileStream(

                fullPath.ToString(), 

                FileMode.Create, 

                FileAccess.Write);

            //Byte단위로 바꾸어 주어야 함.


            byte[] bytes = Encoding.UTF8.GetBytes(saveData);    //string문자가 UTF8인코딩으로 byte화

            fs.Write(bytes, 0, bytes.Length);    //byte 저장. 0부터 총 길이만큼

            fs.Close();


            }

            catch(DirectoryNotFoundException e)

            {

                Console.WriteLine("디렉터리가 없습니다. 생성합니다.");

                Directory.CreateDirectory(path);

                SaveByFileStream(fileName);

                return;

            }

            catch(Exception e)

            {

                Console.WriteLine(e);

                return;

            }

            Console.WriteLine("세이브 완료(SaveByFileStream)");

        }


        //2.StreamWriter

        public void SaveByFileStreamWriter(string fileName = "S_StreamWriter.txt")

        {

            StringBuilder fullPath = new StringBuilder();

            fullPath.Append(path2);

            fullPath.Append("/");

            fullPath.Append(fileName);

        


            try

            {

                //상단에 using System.IO; 추가

                FileStream fs = new FileStream(

                    fullPath.ToString(),

                    FileMode.Create,

                    FileAccess.Write);

                StreamWriter sw = new StreamWriter(fs);    //스트림을 만들어서 

                sw.WriteLine(saveData);    //일괄 저장

                sw.Close();

                fs.Close();


            }

            catch (DirectoryNotFoundException e)

            {

                Console.WriteLine("디렉터리가 없습니다. 생성합니다.");

                Directory.CreateDirectory(path2);    //디렉터리 생성

                SaveByFileStreamWriter(fileName);   //자기 자신 다시 부름

                return; //함수 종료

            }

            catch (Exception e)

            {

                Console.WriteLine(e);

                return;

            }

            Console.WriteLine("세이브 완료(SaveByFileStreamWriter)");

        }



        //3.WriteAllText

        public void SaveByWriteAllText(string fileName = "S_WriteAllText.txt")

        {

            StringBuilder fullPath = new StringBuilder();

            fullPath.Append(path3);

            fullPath.Append("/");

            fullPath.Append(fileName);

            //string fullPath = path + "/" + fileName;


            try

            {

                File.WriteAllText(fullPath.ToString(), saveData);  //핵심 - string 통째로 저장

            }

            catch (DirectoryNotFoundException e)

            {

                Console.WriteLine("디렉터리가 없습니다. 생성합니다.");

                Directory.CreateDirectory(path3);    //디렉터리 생성

                SaveByWriteAllText(fileName);   //자기 자신 다시 부름

                return; //함수 종료

            }

            catch (Exception e)

            {

                Console.WriteLine(e);

                return;

            }

            Console.WriteLine("세이브 완료(SaveByWriteAllText)");

        }


        //4.WriteAllLines

        public void SaveByWriteAllLines(string fileName = "S_WriteAllLines.txt")

        {

            StringBuilder fullPath = new StringBuilder();

            fullPath.Append(path2);

            fullPath.Append("/");

            fullPath.Append(fileName);

            //string fullPath = path + "/" + fileName;


            try

            {

                File.WriteAllLines(fullPath.ToString(), saveData2);    //핵심 - string 배열 저장

            }

            catch (DirectoryNotFoundException e)

            {

                Console.WriteLine("디렉터리가 없습니다. 생성합니다.");

                Directory.CreateDirectory(path2);    //디렉터리 생성

                SaveByWriteAllLines(fileName);   //자기 자신 다시 부름

                return; //함수 종료

            }

            catch (Exception e)

            {

                Console.WriteLine(e);

                return;

            }

            Console.WriteLine("세이브 완료(SaveByWriteAllLines)");

        }

//짧은게 쓰기에는 편하지만 준비과정이 길고 쓰기 불편하게 성능은 더 좋지 않을 까 한다.

정~~~말 쉽게 3D프로그래밍을 할 수 있게 

잘 만들어진 엔진 툴인거 같다.


DirectX로 게임 하나 만들 때에는 

Vector3하나부터 갖가지 Matrix 변수들까지 

신경 써줄게 많았는데

Unity는 오브젝트 생성이나 각각의

world의 location, scale, pos컨트롤

메테리얼 적용,

카메라 컨트롤, 

충돌 함수, 조명, 

심지어 셰이더로 어렵게 써야하는 그림자 까지

유니티는 그냥 된다.

말 그대로 기본적으로 되어있더라.....그냥이다...그냥...


정말 크나큰 감동이다.

아예 쌩초보자가 보기에는 

위의 설명들도 어려울수 있겠고

Unity 자습서동영상을 봐도 

뭔말인가 싶겠지만

DirectX에서 3D의 개념을 공부하고

익힌 사람이라면(게임 좀 쟈기가 만들어 봤다면)

Unity는 정말 쉬운 툴이다.


이렇게 첫 초행길에 감동을 받았는데 

앞으로 중, 고급 스킬을 익힐 때는 어떨지 기대가 된다.