C#

C# 파일과 디렉터리

윤태영(Coding) 2023. 6. 19. 15:41

Visual Studio C# 콘솔 앱 프로젝트 이름 지정(예: FileAndDirectoryManagement) 그리고 "만들기"를 클릭해서 프로젝트를 만들자. (여기서 Console.APP은 NET Core를 사용해야 하는데, Net Core는 NET 5.0 이후 Version이 통일되어서, NET 5.0 이후 Version을 쓰면 된다. NET 7.0을 쓰도록 하자.)

< 파일과 디렉터리에 필요한 네임스페이스 >

파일과 디렉터리를 다루기 위해, System.IO 네임스페이스가 필요하다. Program.cs 파일 맨 위에 다음 코드를 추가하자.

using System.IO;

 

< 텍스트 파일 쓰기 >

텍스트 파일에 쓰는 것은 일반적으로 로그 기록이나 설정 파일을 만들 때 사용된다.
C#에서 StreamWriter 클래스를 사용하여 텍스트 파일에 쓸 수 있다.

< StreamWriter의 장점 >

StreamWriter는 텍스트 파일에 쓰기를 매우 간단하게 만들어준다. 몇 줄의 코드만으로 파일에 텍스트를 쓸 수 있고, 복잡한 설정 없이도 기본적인 작업을 수행할 수 있다.버퍼링을 사용하여 쓰기 작업을 효율적으로 수행할 수 있다. 즉, 작은 데이터 조각들을 메모리에 모아 놓고 한 번에 디스크에 쓰는 방식으로 입출력 성능을 향상시킨다. 예를 들어서 마트에서 쇼핑을 할 때, 고르자마자 계산대로 간다면 시간이 많이 걸린다. 대신, 여러 생필품이나 살 것들을 카트에 담아서 한번에 계산대로 가져가면 훨씬 효율적이다.StreamWriter도 이와 비슷한 방식으로 작동한다. 데이터를 메모리에 모아놓고 한 번에 파일에 쓰는 방식으로 입출력 성능을 향상시킨다. StreamWriter를 사용하면 쉽게 라인 브레이크를 추가할 수 있고, 다양한 인코딩 옵션을 설정할 수 있다. 이를 통해 다양한 텍스트 파일 포맷과 문자셋을 처리하는 데 유용하다. 또한, StreamWriter는 텍스트 파일에 쓸 때 텍스트를 추가하는 기능을 제공한다. 이를 통해 기존의 파일 내용을 덮어쓰지 않고 계속해서 데이터를 추가할 수 있다. 이 기능은 로그 기록과 같이 지속적으로 데이터가 쌓이는 경우에 매우 유용하다.  마치, 일기장에 일기를 쓰는 것과 같다.

string filePath = "example.txt"; // 파일 경로를 변수로 저장.

// StreamWriter를 사용하여 텍스트 파일에 쓸 수 있다.
using (StreamWriter writer = new StreamWriter(filePath))
{
    writer.WriteLine("안녕하세요!"); // 한 줄 작성
    writer.WriteLine("액션 빔!"); // 또 다른 줄
}

 

< 텍스트 파일 읽기 >

텍스트 파일을 읽는 것은 설정을 불러오거나 로그를 확인할 때 유용합니다.

StreamReader 클래스를 사용하여 텍스트 파일을 읽을 수 있다.

// StreamReader로 텍스트 파일을 열어서 읽기
using (StreamReader reader = new StreamReader(filePath))
{
    string line; // 각 줄을 저장할 변수를 선언
    
    // 파일의 끝에 도달할 때까지 각 줄을 읽는다.
    while ((line = reader.ReadLine()) != null)
    {
        Console.WriteLine(line); // 콘솔에 각 줄을 출력한다.
    }
}

 

이제 이 두개를 통해서, 메모장을 만들어서, 내용을 적고, 저장하는 것을 할 수 있다.

using System;
using System.IO;

namespace NoteTakingApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //저장할 파일 이름
            Console.WriteLine("저장할 파일 이름을 입력하세요 (예: mynotes.txt):");
            string fileName = Console.ReadLine();

            //메모 내용을 입력 받는다.
            Console.WriteLine("메모할 내용을 입력하세요. (입력을 끝내려면 'END'를 입력하세요):");
            string line;
            using (StreamWriter writer = new StreamWriter(fileName))
            {
                while ((line = Console.ReadLine()) != null)
                {
                    // END를 입력하면 루프를 종료
                    if (line.ToUpper() == "END")
                    {
                        break;
                    }
                    // 입력한 텍스트를 파일에 기록
                    writer.WriteLine(line);
                }
            }

            // 파일 저장이 완료되었음을 알림.
            string fullPath = Path.GetFullPath(fileName);
            Console.WriteLine($"메모가 '{fullPath}'에 저장되었습니다!");
        }
    }
}

이렇게 사용자 입력을 받고, 내용을 저장하는 코드를 작성 후, GetFullPath를 통해, 경로를 알려주게 하면 어디에 저장되었는지 알 수 있다. 밑과 같이 경로를 말해준다.

Console에 입력한 것들이 저장되는 것을 볼 수 있다.

< 이진 파일 다루기 >

이진 파일은 텍스트 형식이 아닌 데이터를 저장한다. 예를 들어, 이미지, 오디오, 동영상 파일이 있다.

< 이진 파일 쓰기 >

BinaryWriter를 사용하여 이진 파일에 쓸 수 있다.

string binaryFilePath = "example.bin"; // 이진 파일의 경로를 변수로 저장.

// BinaryWriter로 이진 파일에 쓸 수 있다.
using (BinaryWriter writer = new BinaryWriter(File.Open(binaryFilePath, FileMode.Create)))
{
    writer.Write(123); // 정수
    writer.Write("이진 파일 예제"); // 문자열
}

 

< 이진 파일 읽기 >

BinaryReader를 사용하여 이진 파일을 읽을 수 있다.

// BinaryReader로 이진 파일을 열어서 읽기.
using (BinaryReader reader = new BinaryReader(File.Open(binaryFilePath, FileMode.Open)))
{
    int number = reader.ReadInt32(); // 정수
    string text = reader.ReadString(); // 문자열

    Console.WriteLine($"Number: {number}, Text: {text}"); // 콘솔에 출력
}

이것을 통해서, 사용자의 텍스트와 이미지 파일을 입력 받아서, 저장경로에 저장할 수 있는 코드를 적용 해볼 수 있다.

Visual Studio에서 "새 프로젝트"를 선택하고, "Windows Forms App (.NET)"을 선택하여 프로젝트를 생성해보자.프로젝트 이름을 FilePreviewApp으로 설정한다.

프로젝트가 생성되면, Form1 디자인 뷰에서 다음 컨트롤들을 폼에 드래그해서 추가한다.(추가할려면 도구 상자가 필요하다. 상단에 보기 탭에서 도구 상자를 클릭하도록 하자.

이후, TextBox을 검색해서 드로그앤 드랍 해서  추가한 다음, txtMessage로 설정한다.

Button을 검색해서 이름을 btnBrowse로 설정하고, Text 속성을 "Browse..."로 설정한다.

Button을 하나 더 추가해서 이름을 btnSave로 설정하고, Text 속성을 "Save"로 설정한다.


PictureBox를 검색해서 이름을 pictureBox로 설정한다.

 

위와 같이 만들면 대략 이런 모습이 완성된다.

 

이후, Form1.cs에서 파일저장 로직을 작성하고, Form1.Desinger.cs에서 속성을 설정해준다.

// FilePreviewApp/Form1.cs
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace FilePreviewApp
{
    public partial class Form1 : Form
    {
        private string selectedFilePath; // 선택된 파일 경로를 저장할 변수

        public Form1()
        {
            InitializeComponent();
        }

        private void btnBrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                selectedFilePath = openFileDialog.FileName;

                // 이미지 파일인 경우
                if (selectedFilePath.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||
                    selectedFilePath.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||
                    selectedFilePath.EndsWith(".bmp", StringComparison.OrdinalIgnoreCase))
                {
                    pictureBox.Image = Image.FromFile(selectedFilePath);
                    pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
                }
                // 텍스트 파일인 경우
                else if (selectedFilePath.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
                {
                    txtMessage.Text = File.ReadAllText(selectedFilePath);
                }
            }
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(selectedFilePath) || string.IsNullOrEmpty(txtMessage.Text))
            {
                MessageBox.Show("메시지와 파일을 선택해주세요.");
                return;
            }

            string destinationDirectory = @"C:\Users\dlem7\source\repos\FileAndDirectoryManagement";
            string destinationFilePath = Path.Combine(destinationDirectory, Path.GetFileName(selectedFilePath));

            try
            {
                // 파일 복사
                File.Copy(selectedFilePath, destinationFilePath, true);

                // 메세지 저장
                string messageFilePath = Path.Combine(destinationDirectory, "message.txt");
                File.WriteAllText(messageFilePath, txtMessage.Text);

                MessageBox.Show("메세지와 파일이 저장되었습니다.");
            }
            catch (Exception ex)
            {
                MessageBox.Show($"오류 발생: {ex.Message}");
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            btnBrowse.Click += btnBrowse_Click;
            btnSave.Click += btnSave_Click;
        }
    }
}
// FilePreviewApp/Form1.Designer.cs
namespace FilePreviewApp
{
    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            btnBrowse = new Button();
            btnSave = new Button();
            txtMessage = new TextBox();
            pictureBox = new PictureBox();
            ((System.ComponentModel.ISupportInitialize)(pictureBox)).BeginInit();
            SuspendLayout();
            // 
            // btnBrowse
            // 
            btnBrowse.Location = new Point(171, 41);
            btnBrowse.Name = "btnBrowse";
            btnBrowse.Size = new Size(75, 23);
            btnBrowse.TabIndex = 0;
            btnBrowse.Text = "Browse...";
            btnBrowse.UseVisualStyleBackColor = true;
            btnBrowse.Click += btnBrowse_Click;
            // 
            // btnSave
            // 
            btnSave.Location = new Point(461, 389);
            btnSave.Name = "btnSave";
            btnSave.Size = new Size(75, 23);
            btnSave.TabIndex = 1;
            btnSave.Text = "Save";
            btnSave.UseVisualStyleBackColor = true;
            btnSave.Click += btnSave_Click;
            // 
            // txtMessage
            // 
            txtMessage.Location = new Point(171, 12);
            txtMessage.Name = "txtMessage";
            txtMessage.Size = new Size(365, 23);
            txtMessage.TabIndex = 2;
            // 
            // pictureBox
            // 
            pictureBox.Location = new Point(171, 64);
            pictureBox.Name = "pictureBox";
            pictureBox.Size = new Size(365, 319);
            pictureBox.TabIndex = 3;
            pictureBox.TabStop = false;
            // 
            // Form1
            // 
            AutoScaleDimensions = new SizeF(7F, 15F);
            AutoScaleMode = AutoScaleMode.Font;
            ClientSize = new Size(800, 450);
            Controls.Add(pictureBox);
            Controls.Add(txtMessage);
            Controls.Add(btnSave);
            Controls.Add(btnBrowse);
            Name = "Form1";
            Text = "Form1";
            Load += Form1_Load;
            ((System.ComponentModel.ISupportInitialize)(pictureBox)).EndInit();
            ResumeLayout(false);
            PerformLayout();
        }

        private Button btnBrowse;
        private Button btnSave;
        private TextBox txtMessage;
        private PictureBox pictureBox;
    }
}

 

이후 실행하면, 아래와 같이 Form1이 실행된다. Save를 누르면, 저장된 경로에 이미지와 텍스트가 저장되는걸 볼 수 있다. Form1에서 저장 경로를 변경하려면 destinationDirectory 변수의 값을 원하는 경로로 설정하면 된다.

 

 

Reference : 이것이 C#이다 3판

https://product.kyobobook.co.kr/detail/S000201856223

 

이것이 C#이다 | 박상현 - 교보문고

이것이 C#이다 | 전문가로 레벨업!C# 프로그래밍 완전 정복이 책은 C#의 기본, 고급 문법과 더불어 기초 클래스 라이브러리까지 다루고 있다. 총 22개 장으로, 앞서 배운 내용을 활용하면서 단계별

product.kyobobook.co.kr