C# Thread를 이용한 파일찾기 메모..
2019. 6. 14. 10:56ㆍC#
728x90
반응형
파일 찾는 Class
class FindClass
{
private string path;
private string key;
private IEnumerable<FileInfo> files;
public IEnumerable<FileInfo> getResult() { return this.files; }
public FindClass() { }
public FindClass(string path, string key) // file info
{
this.path = path;this.key = key;
}
public void GoFind() // 찾기
{
lock(this)
{
// 경로
DirectoryInfo di = new DirectoryInfo(path);
//FileInfo[] files = di.GetFiles(keyword, SearchOption.AllDirectories);
// 디렉토리 IEnumerable 사용하여 검색
IEnumerable<FileInfo> files = di.GetFiles(key, SearchOption.AllDirectories);
// IEnumerable을 이용하면 Fileinfo의 length 가 없기 때문에, 아래와 같이 구함.
int c = files.Count(x => !x.Attributes.HasFlag(FileAttributes.ReparsePoint));
// 결과 표시
if (c > 0) // 검색 결과가 있다면
{
Console.WriteLine("검색 결과 : " + c + " 건이 검색되었습니다.");
}
else
{
Console.WriteLine("검색 결과 : " + " 검색 결과가 없습니다.");
}
// 여기서 저장
this.files = files;
}
}
}
Main Class
#region 파일 찾기 기능
private void SearchButton(object sender, EventArgs e)
{
if (txtKeyword.Text.Trim().Equals("")) // 입력 된 검색어가 없다면
{
MessageBox.Show("검색어를 입력해주세요.", "lee.sunbae", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
if (txtPath.Text.Trim().Equals(""))
{
MessageBox.Show("경로를 지정해주세요.", "lee.sunbae", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
listView1.BeginUpdate();
FindClass fc = new FindClass(txtPath.Text, txtKeyword.Text);
Thread th1 = new Thread(new ThreadStart(fc.GoFind));
th1.Start();
th1.Join(); // 다른 스레드 호출 방지
IEnumerable<FileInfo> files = fc.getResult();
pushDel pd = new pushDel(pushData);
Thread th2 = new Thread((delegate () { pushData(files); }));
th2.Start();
//스레드가모두멈추기까지대기
//Thread.Sleep(100);
listView1.EndUpdate();
}
실제 ListView에 뿌려줄 때(Cross Thread 오류 해결 포함)
delegate void pushDel(IEnumerable<FileInfo> files);
// 넣기
void pushData(IEnumerable<FileInfo> files)
{
foreach (FileInfo file in files)
{
ListViewItem item = new ListViewItem(file.Name, 0); // 파일 명
long aSize = Convert.ToInt64(file.Length.ToString());
item.SubItems.Add(FormatBytes(aSize)); // 파일 크기
item.SubItems.Add(file.Extension.ToString()); // 파일 종류 (확장자)
item.SubItems.Add(file.LastAccessTime.ToString()); // 파일 마지막 수정날짜
item.SubItems.Add(file.FullName.ToString()); // 경로
if (listView1.InvokeRequired == true)
{ // 익명 메소드를 이용하여 invoke 처리
listView1.Invoke(new MethodInvoker(delegate () { listView1.Items.Add(item); }));
}
else
{
listView1.Items.Add(item);
}
}
}
728x90
반응형
'C#' 카테고리의 다른 글
C# WebBrowser 스크립트 오류 해결방법 (2) | 2019.06.14 |
---|---|
C# Bytes, KB, MD, GB 변환하기 0.00형식으로 (0) | 2019.06.14 |
C# 아웃룩 서명 가져오기 (0) | 2019.06.14 |
C# 문자열로 된 "1+2+3" 의 합을 구하라! (0) | 2019.06.14 |
C# 엔터 쳤을 때 이벤트 발생시키기 (0) | 2019.06.14 |