반응형
* 폴더 복사 예제...
전체 소스 코드
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
https://kdsoft-zeros.tistory.com/39?category=846221
반응형
'C# Programming' 카테고리의 다른 글
[C#] XML File Write & Read 예제 (0) | 2019.10.23 |
---|---|
[C#] 동적 DLL 폼 (From) 불러오기 또는 클래스 (Class) 함수 불러오기 예제 (0) | 2019.10.21 |
[C#] File CheckSum 예제 (MD5 Checksum) (0) | 2019.10.16 |
[C#] Log File - 로그 작성 예제 (0) | 2019.10.14 |
[C#] 파일 및 폴더 감시 (FileSystemWatcher) (0) | 2019.10.10 |