메인 화면에서 폴더 몇 개를 선택하였고, 백업할 드라이브로 F드라이브를 선택하였다. 참고로 반드시 드라이브일 필요는 없다. 폴더도 루트로 가능하다.
폼의 UI는 책을 보고 따라한 것이 대부분이다. 가장 중요한 핵심은 FileSystem 클래스인데, 이 클래스가 파일의 검색 및 백업을 가능하게 해 준다.
CopyAll() : 한 폴더의 내용을 카피한다.
FileCopy() : 파일을 카피한다.
FindFIle() : 지정한 경로에서의 파일을 검색한다.
MakeDir() : 디렉토리를 하위 디렉토리까지 만든다.
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows.Forms;
class FileSystem
{
/*FindFile : 입력한 파일명에 대해서 하위디렉토리까지 검색해서 리스트뷰에 추가해주는 메서드
* str : 파일명
* dir : 검색할 경로
* lst : 추가할 ListView 컨트롤
*/
public void FindFile(string str, string dir, ListView lst)
{
string tdir = dir.Trim();
if (dir == "")
{
MessageBox.Show("검색할 디렉토리를 입력하세요");
return;
}
string[] files_list;
try
{
DirectoryInfo dinfo = new DirectoryInfo(tdir);
DirectoryInfo[] subdir = dinfo.GetDirectories();
files_list = Directory.GetFiles(tdir, str);
for (int i = 0; i < files_list.Length; i++)
{
ListViewItem item1 = new ListViewItem(files_list[i], 0);
FileInfo finfo = new FileInfo(files_list[i]);
item1.SubItems.Add(finfo.Length.ToString() + "Byte");
item1.SubItems.Add(finfo.CreationTime.ToString());
lst.Items.Add(item1);
}
foreach (DirectoryInfo d in subdir)
{
tdir = d.FullName;
if ((d.Attributes & FileAttributes.System) <= 0)
{
FindFile(str, tdir, lst);
files_list = Directory.GetFiles(tdir, str);
for (int i = 0; i < files_list.Length; i++)
{
ListViewItem item1 = new ListViewItem(files_list[i], 0);
FileInfo finfo = new FileInfo(files_list[i]);
item1.SubItems.Add(finfo.Length.ToString() + "Byte");
item1.SubItems.Add(finfo.CreationTime.ToString());
lst.Items.Add(item1);
}
}
}
}
catch (Exception e)
{
Console.WriteLine("파일 검색 중 예외 발생");
Console.WriteLine(e.Message);
Console.WriteLine(e.ToString());
Console.WriteLine(tdir);
}
}
/*CopyAll : 특정 디렉토리의 모든 폴더와 파일을 다른 드라이브로 옮기는 메서드
* args : 원본의 경로
* drive : 옮길 드라이브
*/
public void CopyAll(string args, string drive)
{
DirectoryInfo dinfo = new DirectoryInfo(args);
string dest;
if (dinfo.Exists)
{
DirectoryInfo[] dir = dinfo.GetDirectories();
foreach (DirectoryInfo d in dir)
{
CopyAll(d.FullName, drive);
}
FileInfo[] fs = dinfo.GetFiles();
foreach (FileInfo f in fs)
{
dest = f.Directory.FullName;
dest = dest.Remove(0, 2);
dest = dest.Insert(0, drive);
Console.WriteLine("Copy " + f.Name + " to " + dest);
FileCopy(f.FullName, dest, 0);
}
}
}
/* MakeDir : 디렉토리를 만드는 메서드
* dir : 만들 디렉토리의 경로
*/
public void MakeDir(string dir)
{
DirectoryInfo dinfo = new DirectoryInfo(dir);
if (dinfo.Exists == false)
{
dinfo.Create();
}
}
/* FileCopy : 파일을 복사하는 함수
* src : 복사할 파일의 경로 및 파일 이름
* dest : 복사할 목적지
* mode : 파일을 복사할것인지, 이동할것인지 설정
*/
public void FileCopy(string src, string dest, int mode)
{
FileInfo finfo = new FileInfo(src);
FileInfo fsrc;
if (finfo.Exists == true)
{
MakeDir(dest);
dest = dest + "\\" + finfo.Name;
switch (mode)
{
case 0:
fsrc = finfo.CopyTo(dest, true);
break;
case 1:
finfo.MoveTo(dest);
break;
}
}
}
}