Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

ChiuCS
Lv 6
ChiuCS asked in 電腦與網際網路程式設計 · 1 decade ago

檔名過濾器

我有一個目錄,檔案數量非常之大,(約15萬筆)

目錄內的檔案會不定時增/刪,(所以無法在平時先記錄檔名備用) (但數量都大約維持在15\

萬筆)

想寫一個程式,方便找尋目錄內部的某一個檔案(如包含*ABC*)

因為檔案的開頭文字差異性有限,(檔名都是以B2開頭,MS無法使用B2*ABC*來dir)

檔名文數字字數又不定(約15至25字完)

查尋全部的檔案,並過濾符合的檔名

速度非常的慢(要好多分鐘以上)

想請問,有何API可以快速過濾檔名

(NOTE:我有用網路上freesware的檔案總管所提供的檔名過濾器功能,

它的速度約在數秒,是否有人知道它是如何作到的)

感謝各位大大的耐心閱讀與回覆

2 Answers

Rating
  • 1 decade ago
    Favorite Answer

    WCHAR szFilter[MAX_PATH];

    GetListFileFilter(szFilter);///// "*.ext"

    //wcscat(szPath, L"*.*");

    WCHAR szPathFilter[MAX_PATH];

    swprintf(szPathFilter,L"%s%s",szPath,szFilter);

    //wcscat(szPath, szFilter);

    CFileFind finder;

    BOOL bWorking = finder.FindFile(szPathFilter);//搜尋檔案

    int i = 0;

    ULONGLONG FileLen;

    WCHAR len[MAX_PATH];//儲存檔案長度的字元陣列

    CTime LastWriteDate;//儲存檔案最後修改日期的CTime物件

    m_list_xfile.DeleteAllItems();//刪除IDC_FILE_LIST控制項中所有項目

    while (bWorking)

    {

    bWorking = finder.FindNextFile();//尋找下一個檔案

    if(finder.IsDots())//如果搜尋到的檔案為.(根目錄)或者

    continue;//..(上一層目錄)時,則中斷此次迴圈的執行

    if(finder.IsDirectory())//判斷搜尋到的檔案是否為資料夾

    {

    m_list_xfile.InsertItem( LVIF_TEXT | LVIF_IMAGE, i,finder.GetFileTitle(), 0, 0, 0, 0);

    //將搜尋到的資料夾加入IDC_FILE_LIST控制項中

    finder.GetLastWriteTime(LastWriteDate);

    //取得檔案的最後修改時間

    m_list_xfile.SetItemText(i, 2,LastWriteDate.Format("%Y/%m/%d %H:%M"));

    //設定該項目的第二個欄位(Last Write Time)

    }

    else

    {

    CString strFilename=finder.GetFileName();

    WCHAR szDrive[MAX_PATH];

    WCHAR szDir[MAX_PATH];

    WCHAR szFilename[MAX_PATH];

    WCHAR szExt[MAX_PATH];

    _wsplitpath(strFilename,szDrive,szDir,szFilename,szExt);

    if (wcscmp(szExt,L".x")==0||wcscmp(szExt,L".X")==0)

    {

    m_list_xfile.InsertItem(LVIF_TEXT | LVIF_IMAGE, i, finder.GetFileName(), 0, 0, 2, 0);

    }

    else

    {

    m_list_xfile.InsertItem(LVIF_TEXT | LVIF_IMAGE, i, finder.GetFileName(), 0, 0, 1, 0);

    }

    //將搜尋到的檔案加入IDC_FILE_LIST控制項中

    FileLen = finder.GetLength() / 1024;

    //計算檔案的大小,單位為KB

    FileLen = (FileLen == 0 ? 1 : FileLen);

    //計算檔案大小,小於1KB則顯示為1KB,大於1KB顯示為實際長度

    wsprintf(len, L"%d KB", FileLen);//將檔案的大小輸出成字串

    finder.GetLastWriteTime(LastWriteDate);

    //取得檔案的最後修改時間

    m_list_xfile.SetItemText(i, 1, len);

    //設定該項目的第一個欄位(Size)

    m_list_xfile.SetItemText(i, 2, LastWriteDate.Format("%Y/%m/%d %H:%M"));

    //設定該項目的第二個欄位(Last Write Time)

    }

    ++i;//將項目的個數加一

    }

    }

  • 1 decade ago

    我印象中可以、且剛才實驗,確定可以用 dir B2*ABC* 耶!

    2009-02-11 05:45:53 補充:

    我沒看到回答者的程式有尋找 版大指定的『B2*ABC*』的功能。

    標準的做法,要用 state machine 去做

    2009-02-11 12:41:54 補充:

    98 及以前的 DOS 不行

    ME, NT 不詳,(使用時間不超過 3小時)

    XP 起已經可以了

    版大,你用的是那麼舊的 Windows?

Still have questions? Get your answers by asking now.