하아찡

C# FileIO 프로젝트 본문

C#/코인프로그램 - 코드

C# FileIO 프로젝트

하아찡 2023. 11. 27. 01:25

FileIO 프로젝트에는 파일 생성, 저장, 불러오기 기능을 추가했습니다.

그래서 각종 셋팅데이터, 로드, Key값 등의 사용했습니다.

 

FncFileIO.cs(전체 코드)

using System.Runtime.Serialization.Formatters.Binary;


namespace FileIO
{

    public enum FileTypes
    {
        Create,
        Append,
        OpenOrCreate,
        CreateNew,
        Open,
        Truncate
    }
    public class FncFileIO
    {
        public string AppPath { get; private set; }


        public FncFileIO()
        {
            AppPath = Environment.CurrentDirectory;
        }

        /// <summary>
        /// 폴더가 없을경우 폴더 생성
        /// </summary>
        private void DirExists(string AddPath)
        {
            DirectoryInfo di = new DirectoryInfo($"{AppPath}\\{AddPath}");
            if (!di.Exists) { di.Create(); }
        }

        /// <summary>
        /// 읽기전 유무 확인
        /// </summary>
        /// <param name="AddPath">추가 경로</param>
        /// <param name="FileName">파일명 및 확장자</param>
        /// <returns></returns>
        private void FileExists(string AddPath, string FileName)
        {
            DirExists(AddPath);
            FileInfo fi = new FileInfo(GetFilePath(AddPath,FileName));
            if (!fi.Exists) 
            {
                //파일 생성 후 종료 / 안할시 다른 프로세서에서 참조중이라고 오류뜸
                var myFile =  fi.Create();
                myFile.Close();
            }
        }

        /// <summary>
        /// 파일읽기
        /// </summary>
        /// <typeparam name="T">데이터 타입</typeparam>
        /// <param name="AddPath">추가 경로</param>
        /// <param name="FileName">파일명 및 확장자</param>
        /// <returns></returns>
        public List<T> FileListRead<T>(string AddPath, string FileName)
        {
            List<T> values = new List<T>();

            FileExists(AddPath, FileName);


            return values;
        }

        public T FileRead<T>(string AddPath, string FileName)
        {
            T values = default(T);
                
            FileExists(AddPath, FileName);

            try
            {
                using (FileStream fs = new FileStream(GetFilePath(AddPath, FileName), FileMode.Open, FileAccess.Read))
                {
                    if (fs.Length != 0)
                    {
                        BinaryFormatter bf = new BinaryFormatter();
                        values = (T)bf.Deserialize(fs);
                    }

                }
            }
            catch(Exception ex)
            {

            }

            return values;
        }

        #region LogFileWrite
        /// <summary>
        /// 파일쓰기
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="AddPath">추가경로</param>
        /// <param name="FileName">파일명</param>
        /// <param name="Type"></param>
        /// <param name="InputData"></param>
        /// <param name="Logs"></param>
        public void LogFileWrite(string AddPath, string FileName, bool Append, string InputData, string Logs)
        {
            FileExists(AddPath, FileName);
            if (InputData is not null)
            {
                using (StreamWriter sw = new StreamWriter(GetFilePath(AddPath, FileName), Append))
                {
                    string LogTime = DateTime.Now.ToString("HH:mm:ss");
                    sw.WriteLine($"[  {Logs} : {LogTime} ] {InputData}");
                }
            }
        }

        public void LogFileWrite<T>(string AddPath, string FileName, bool Append, List<T> InputData, string Logs)
        {
            FileExists(AddPath, FileName);
            if (InputData is not null)
            {
                using (StreamWriter sw = new StreamWriter(GetFilePath(AddPath, FileName), Append))
                {
                    foreach (T t in InputData)
                    {
                        string LogTime = DateTime.Now.ToString("HH:mm:ss");
                        sw.WriteLine($"[  {Logs} : {LogTime} ] {t}");
                    }
                }
            }
        }

        #endregion LogFileWrite

        public void FileWrite<T>(string AddPath, string FileName, T InputData)
        {
            FileExists(AddPath, FileName);
            if (InputData is not null)
            {
                using (FileStream fs = new FileStream(GetFilePath(AddPath, FileName), FileMode.OpenOrCreate, FileAccess.Write))
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(fs, InputData);
                }
            }
        }


        private string GetFilePath(string AddPath, string FileName)
        {
            string path = $"{AppPath}\\{(AddPath == "" ? FileName : AddPath + "\\" + FileName)}";

            return path;
        }
    }
}

 

 

생성자

public FncFileIO()
{
    AppPath = Environment.CurrentDirectory;
}

저장될 경로를 현재 실행파일 경로를 AppPath값을 넣어 사용함

 

 

폴더 및 파일유무 체크

/// <summary>
/// 폴더가 없을경우 폴더 생성
/// </summary>
private void DirExists(string AddPath)
{
    DirectoryInfo di = new DirectoryInfo($"{this.AppPath}\\{AddPath}");
    if (!di.Exists) { di.Create(); }
}

/// <summary>
/// 읽기전 유무 확인
/// </summary>
/// <param name="AddPath">추가 경로</param>
/// <param name="FileName">파일명 및 확장자</param>
/// <returns></returns>
private void FileExists(string AddPath, string FileName)
{
    DirExists(AddPath);
    FileInfo fi = new FileInfo(GetFilePath(AddPath,FileName));
    if (!fi.Exists) 
    {
        //파일 생성 후 종료 / 안할시 다른 프로세서에서 참조중이라고 오류뜸
        var myFile =  fi.Create();
        myFile.Close();
    }
}

DirExists -> 폴더유무체크 없을경우 생성함.

FileExists -> 파일유무 체크 없을경우 생성함.

 

 

파일 저장

public void FileWrite<T>(string AddPath, string FileName, T InputData)
{
    FileExists(AddPath, FileName);
    if (InputData is not null)
    {
        using (FileStream fs = new FileStream(GetFilePath(AddPath, FileName), FileMode.OpenOrCreate, FileAccess.Write))
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fs, InputData);
        }
    }
}

저장될 데이터 타입은 제네릭을 사용하여 Serialize(직렬화)를 하여 데이터를 저장함.

데이터를 직렬화해서 저장하기위해 아래와 같이  "[Serializable]"를 붙여줘야 가능함.

[Serializable]
public struct FileIOAccess
{
    public string AccessKey;
    public string SecretKey;
}

 

 

파일 로드

public T FileRead<T>(string AddPath, string FileName)
{
    T values = default(T);
        
    FileExists(AddPath, FileName);

    try
    {
        using (FileStream fs = new FileStream(GetFilePath(AddPath, FileName), FileMode.Open, FileAccess.Read))
        {
            if (fs.Length != 0)
            {
                BinaryFormatter bf = new BinaryFormatter();
                values = (T)bf.Deserialize(fs);
            }

        }
    }
    catch(Exception ex)
    {

    }

    return values;
}

저장과 비슷하게 제네릭으로 데이터타입 받아온 후 해당 데이터 타입으로 값을 반환시켜줌.

 

 

각종 로그 저장

#region LogFileWrite
/// <summary>
/// 파일쓰기
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="AddPath">추가경로</param>
/// <param name="FileName">파일명</param>
/// <param name="Type"></param>
/// <param name="InputData"></param>
/// <param name="Logs"></param>
public void LogFileWrite(string AddPath, string FileName, bool Append, string InputData, string Logs)
{
    FileExists(AddPath, FileName);
    if (InputData is not null)
    {
        using (StreamWriter sw = new StreamWriter(GetFilePath(AddPath, FileName), Append))
        {
            string LogTime = DateTime.Now.ToString("HH:mm:ss");
            sw.WriteLine($"[  {Logs} : {LogTime} ] {InputData}");
        }
    }
}

public void LogFileWrite<T>(string AddPath, string FileName, bool Append, List<T> InputData, string Logs)
{
    FileExists(AddPath, FileName);
    if (InputData is not null)
    {
        using (StreamWriter sw = new StreamWriter(GetFilePath(AddPath, FileName), Append))
        {
            foreach (T t in InputData)
            {
                string LogTime = DateTime.Now.ToString("HH:mm:ss");
                sw.WriteLine($"[  {Logs} : {LogTime} ] {t}");
            }
        }
    }
}

#endregion LogFileWrite

 

반응형