C# Thread를 이용한 파일찾기 메모..

2019. 6. 14. 10:56C#

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
반응형