반응형

* 폴더 복사 예제...

 

메인 화면

전체 소스 코드

Form1.cs

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CSharp_FolderCopy
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //원본 폴더 열기...
            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog() == DialogResult.OK)
            {
                txtOriginFolder.Text = fbd.SelectedPath;
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            //대상 폴더 열기...
            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog() == DialogResult.OK)
            {
                txtCopyFolder .Text = fbd.SelectedPath;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //폴더 복사...

            //원본 폴더 또는 복사 대상 폴더를 선택 하지 않았을 경우
            if (txtOriginFolder.Text == "" || txtCopyFolder.Text == "")
            {
                MessageBox.Show("원본 폴더 또는 복사 대상 폴더를 선택해 주세요.", "확 인", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return;
            }

            button3.Text = "폴더 복사 중...";
            button3.Refresh();

            if (FolderCopy(txtOriginFolder.Text, txtCopyFolder.Text))
            {
                MessageBox.Show("폴더 복사가 완료 되었습니다.", "확 인", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            else
            {
                MessageBox.Show("폴더 복사가 실패 하였습니다.", "확 인", MessageBoxButtons.OK, MessageBoxIcon.Error );
            }

            button3.Text ="폴더 복사";
        }
        
        //파일 복사 함수
        private bool FileCopy(string strOriginFile, string strCopyFile)
        {
            System.IO.FileInfo fi = new System.IO.FileInfo(strOriginFile);
            long iSize = 0;
            long iTotalSize = fi.Length;
            //1024 버퍼 사이즈 임의로...
            byte[] bBuf = new byte[1024];

            //동일 파일이 존재하면 삭제 하고 다시하기 위해...
            if (System.IO.File.Exists(strCopyFile))
            {
                System.IO.File.Delete(strCopyFile);
            }

            //원본 파일 열기...
            System.IO.FileStream fsIn = new System.IO.FileStream(strOriginFile, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
            //대상 파일 만들기...
            System.IO.FileStream fsOut = new System.IO.FileStream(strCopyFile, System.IO.FileMode.Create, System.IO.FileAccess.Write);

            while (iSize < iTotalSize)
            {
                try
                {
                    int iLen = fsIn.Read(bBuf, 0, bBuf.Length);
                    iSize += iLen;
                    fsOut.Write(bBuf, 0, iLen);

                }
                catch (Exception ex)
                {
                    //파일 연결 해제...
                    fsOut.Flush();
                    fsOut.Close();
                    fsIn.Close();

                    //에러시 삭제...
                    if (System.IO.File.Exists(strCopyFile))
                    {
                        System.IO.File.Delete(strCopyFile);
                    }
                    return false;
                }

            }
            //파일 연결 해제...
            fsOut.Flush();
            fsOut.Close();
            fsIn.Close();

            return true;
        }

    
        private bool FolderCopy(string strOriginFolder, string strCopyFolder)
        {
            //폴더가 없으면 만듬...
            if (!System.IO.Directory.Exists(strCopyFolder))
            {
                System.IO.Directory.CreateDirectory(strCopyFolder);
            }

            //파일 목록 불러오기...
            string[] files = System.IO.Directory.GetFiles(strOriginFolder);
            //폴더 목록 불러오기...
            string[] folders = System.IO.Directory.GetDirectories(strOriginFolder);

            foreach (string file in files)
            {
                string name = System.IO.Path.GetFileName(file);
                string dest = System.IO.Path.Combine(strCopyFolder, name);
                //파일 복사 부분 넣기...
                FileCopy(file, dest);
            }

            // foreach 안에서 재귀 함수를 통해서 폴더 복사 및 파일 복사 진행 완료  
            foreach (string folder in folders)
            {
                string name = System.IO.Path.GetFileName(folder);
                string dest = System.IO.Path.Combine(strCopyFolder, name);
                FolderCopy(folder, dest);
            }


            return true;
        }

        

    }
}

폴더 복사 함수
파일 복사 함수

* 예제 결과

 

결과 화면

 

 

위 그림들은 테스트 결과 이미지들 입니다. 실제 복사가 정상적으로 이루어 졌는지 복사 하면서 잃게 된 용량은 없는지

 

* 참조 게시글

 

https://kdsoft-zeros.tistory.com/49?category=846221

 

[C#] File Copy (파일 복사 예제)

* 파일 복사 예제 전체 소스 코드 Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text;..

kdsoft-zeros.tistory.com

https://kdsoft-zeros.tistory.com/39?category=846221

 

[C#] 폴더 및 파일, 드라이브 사이즈 (Size) 구하기

* 폴더 및 파일, 드라이브 목록 및 사이즈 구하기 예제 File Open 버튼 : 파일 대화 상자가 뜨게 되며, 해당 파일 선택 시 위 그림과 같이 파일의 위치 와 사이즈가 표시 됩니다. 다만 사이즈 표시는 기본 Byte..

kdsoft-zeros.tistory.com

 

반응형

+ Recent posts