목표 |
- FileSystemWatcher의 이벤트와 속성을 이해한다.
- 파일을 다루는 방법을 배운다.
- Splitter 사용법을 배운다
컴포넌트 설명 |
FileSystemWatcher : 파일시스템 속성 변경을 확인 할 수 있는 컴포넌트
DirectoryInfo : 디렉토리의 파일과 속성을 가져 올 수 있는 컴포넌트
Splitter : 화면을 분리해 주는 컴포넌트로 분리된 사이즈의 크기를 조정할때 사용됨
폼구성 |
위와 같이 화면 구성하자.
사용된 컴포넌트
상단 : Panel 안에 label,textBox,Button
하단 : groupbox 2개,splitter 1개 , 왼쪽 groupbox 의 Dock 속성을 left, 오를쪽 groupbox 의 속성을 Client 로 설정
왼쪽 groupbox : ListView - Columns 에 헤더 등록 및 View를 Details 로 설정
오른쪽 groupbox : 상단 panel(label 2개,TextBox 1개,ComboBox 1개,Button 2개) , 하단 ListBox
기타 : folderBrowserDialog,saveFileDialog,contextMenuStrip
소스코드 구현 |
1. 경로 버튼을 클릭 했을때 해당 폴더를 선택 후 파일 탐색기에 파일 보기 구현
-쓰레드에서 파일보기(FileView) 구현을 실행 시킨다.
1
2
3
4
5
6
7
8
|
if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
this.listView1.Items.Clear();
this.txtPath.Text = this.folderBrowserDialog1.SelectedPath;
threadFileView = new Thread(new ParameterizedThreadStart(FileView));
threadFileView.Start(this.folderBrowserDialog1.SelectedPath); ///선택된 디렉토리를 매개변수로 넘기자.
}
|
cs |
- FileView 코드 : 속성을 전체 혹은 숨김파일 제외 속성에 따라 파일 목록을 읽어 와서 OnFile Delegate 에 내용을 전달하여 OnFile 에서 리스트뷰에 뿌려주는 역할을 수행하고 하위디렉토리는 다시 들어가서 똑같은 작업을 반복 수행하자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
private void FileView(object dir)
{
DirectoryInfo di = new DirectoryInfo((string)dir);
DirectoryInfo[] dti = di.GetDirectories();
foreach (var f in di.GetFiles())
{
if (HiddenFile == true) //전체 파일을 모두 조회한다.
{
Invoke(OnFile, f.Name, f.Length.ToString(),
f.CreationTime.ToString());
}
else
{
if (!f.Attributes.ToString().Contains(FileAttributes.Hidden.ToString())) // 속성이 숨김파일이 아닐 때만 조회한다.
{
Invoke(OnFile, f.Name, f.Length.ToString(),
f.CreationTime.ToString());
}
}
}
for (int i = 0; i < di.GetDirectories().Length; i++) ///하위 디렉토리 파일을 조회 하자.
{
try
{
FileView(dti[i].FullName);
}
catch
{
continue;
}
}
}
|
cs |
-OnFile 델리게이트 생성 및 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
Thread threadFileView = null; //파일조회 스레드 개체 생성
private delegate void OnDelegateFile(string fn, string fl, string fc);
private OnDelegateFile OnFile = null; //델리게이트 생성
bool HiddenFile = true; //전체 조회, False 일때는 숨김파일이 아닌경우만 조회
private void Form1_Load(object sender, EventArgs e)
{
OnFile = new OnDelegateFile(ListViewAdd); //OnFile 델리게이트에서 ListViewAdd를 실행시키자.
}
private void ListViewAdd(string fn, string fl, string fc) //리스트뷰에 들어온 데이터를 추가하자
{
string fSize = GetFileSize(Convert.ToDouble(fl));
this.listView1.Items.Add(new ListViewItem(new string[] { fn, fc, fSize }));
}
private string GetFileSize(double byteCount) //파일사이즈를 Bytes,KB,MB,GB 단위로 표현하자.
{
string size = "0 Bytes";
if (byteCount >= 1024 * 1024 * 1024)
size = String.Format("{0:##.##}", byteCount / (1024 * 1024 * 1024)) + " GB";
else if (byteCount >= 1024 * 1024)
size = String.Format("{0:##.##}", byteCount / (1024 * 1024)) + " MB";
else if (byteCount >= 1024)
size = String.Format("{0:##.##}", byteCount / 1024) + " KB";
else if (byteCount > 0 && byteCount < 1024.0)
size = byteCount.ToString() + " Bytes";
return size;
}
|
cs |
- 파일 모니터 구현 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
private FileSystemWatcher Watcher;
private bool let = false; //더블 모니터 방지
private delegate void DelegateCreateListBoxItem(string EventName, string DateTime, string FilePath); //델리게이트 선언
private void btnMonitor_Click(object sender, EventArgs e)
{
if (this.txtPath.Text == "") return;
if (this.btnMonitor.Text == "모니터 ON")
{
this.btnMonitor.Text = "모니터 OFF";
this.btnSave.Enabled = false;
Watcher = new FileSystemWatcher();
Watcher.Filter = "*." + this.txtExtension.Text.ToLower();
Watcher.Path = Environment.ExpandEnvironmentVariables(this.txtPath.Text);
if (this.cbMonitor.Text == "ON")
Watcher.IncludeSubdirectories = true;
else
Watcher.IncludeSubdirectories = false;
Watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
Watcher.Changed += new FileSystemEventHandler(OnChanged);
Watcher.Created += new FileSystemEventHandler(OnCreated);
Watcher.Deleted += new FileSystemEventHandler(OnDeleted);
Watcher.Renamed += new RenamedEventHandler(OnRenamed);
Watcher.EnableRaisingEvents = true;
}
else
{
if (Watcher != null)
{
Watcher.Changed -= new FileSystemEventHandler(OnChanged);
Watcher.Created -= new FileSystemEventHandler(OnCreated);
Watcher.Deleted -= new FileSystemEventHandler(OnDeleted);
Watcher.Renamed -= new RenamedEventHandler(OnRenamed);
Watcher.EnableRaisingEvents = false;
}
this.btnMonitor.Text = "모니터 ON";
this.btnSave.Enabled = true;
}
}
private void OnRenamed(object sender, RenamedEventArgs e)
{
CreateListBoxItem("Renamed", DateTime.Now.ToString(), e.FullPath);
}
private void OnDeleted(object sender, FileSystemEventArgs e)
{
CreateListBoxItem("Deleted", DateTime.Now.ToString(), e.FullPath);
}
private void OnCreated(object sender, FileSystemEventArgs e)
{
CreateListBoxItem("Created", DateTime.Now.ToString(), e.FullPath);
}
private void OnChanged(object sender, FileSystemEventArgs e)
{
if (let == false)
{
let = true;
CreateListBoxItem("Changed", DateTime.Now.ToString(), e.FullPath);
}
else
{
let = false;
}
}
private void CreateListBoxItem(string EventName, string DateTime, string fullPath)
{
if (this.lbLog.InvokeRequired)
{
DelegateCreateListBoxItem DelView = new DelegateCreateListBoxItem(InvokedCreateListViewItem);
Invoke(DelView, new object[3] { EventName, DateTime, fullPath });
}
else
{
InvokedCreateListViewItem(EventName, DateTime, fullPath);
}
}
private void InvokedCreateListViewItem(string eventName, string dateTime, string fullPath)
{
this.lbLog.Items.Add(eventName + " : (" + dateTime + ") : " + fullPath);
}
private void btnSave_Click(object sender, EventArgs e)
{
if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string savepath = this.saveFileDialog1.FileName;
StreamWriter sw = new StreamWriter(savepath);
foreach (string s in this.lbLog.Items)
{
sw.WriteLine(s);
}
sw.Close();
}
}
}
|
cs |
- FileSystemWatcher 이벤트 속성
1) Changed : 지정된 Path에서 파일이나 디렉토리가 변경될때 발생
2) Created : 파일이나 디렉토리가 생성될때 발생
3) Deleted : 파일이나 디렉토리 삭제될때 발생
4) Renamed : 디렉토리나 파일 이름이 변경될때 발생
- NotifyFilter (조사할 내용 형식)
1) Attributes : 파일 또는 폴더의 특성
2) CreationTime : 파일이나 폴더를 만든시간
3) DirectoryName: 디렉터리의 이름
4) FileName : 파일의 이름
5) LastAccess : 파일 또는 폴더를 마지막으로 연 날짜
6) LastWrite : 파일 또는 폴더를 마지막으로 접근한 날짜
7) Security : 파일 또는 폴더의 보안설정
8) Size : 파일 또는 폴더의 크기
활용 |
파일의 변경 상태를 모니터링 하면서 변경된 파일을 백업기능 등을 구현 할 수 있다.
=====================================================
이 자료는 학생들과 특강시간에 만들어 보는 프로젝트입니다.
=====================================================
오늘도 최선을 다하는 우리 학생들을 응원합니다.
인천 서구 검단신도시 원당컴퓨터학원
'강의자료 > C#' 카테고리의 다른 글
[C#] IKeyboardMouseEvents 객체를 활용하여 화면보호기를 만들어 보자 (9) | 2021.02.03 |
---|---|
[C#] 비트맵 이미지를 활용하여 폼의 디자인에 날개를 달아 보자. (0) | 2021.01.04 |
[C#] PerformanceCounter 를 활용하여 작업관리자 구현 (0) | 2020.12.16 |
[C#] WebClient를 이용하여 웹다운로드 기능 구현 (0) | 2020.12.16 |
[C#] WebBrowser를 이용해서 간단한 웹브라우저를 만들어 보자 (0) | 2020.12.16 |