各位大虾,怎样实现硬盘里所有分区所有目录的文件查找!用CFileFind都要指定路径啊!急!

解决方案 »

  1.   

    最好用C++函数来进行查找不用MFC封装的CFileFind.
    _chdir(); //设置当前目录
    _findfirst() ; //只在当前目录查找
    _findnext(); //查找下一个
    具体函数使用参照MSDN
      

  2.   

    用 DWORD GetLogicalDrives(VOID); 得到所有的逻辑盘,然后对每一个逻辑盘使用递归遍历,可以使用 WIN32 API:FindFirstFile();
    FindNextFile();
    FindClose();
      

  3.   

    自己写了一个,代码如下,下面的m_list是对话框上的一个ListBox,IDC_LISTBOX是个静态文本框
    BOOL Cdlg1Dlg::FindFile(LPCTSTR pszFileName)
    {
         WIN32_FIND_DATA FileData;
         HANDLE hSearch;
         TCHAR   szFile2Find[]=_T("*");     hSearch=::FindFirstFile(szFile2Find, &FileData); 
         if (hSearch == INVALID_HANDLE_VALUE) 
    return FALSE;
        if(FileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
    {
    if(FileData.cFileName[0]!=_T('.'))
    {
    SetCurrentDirectory(FileData.cFileName);
    FindFile(pszFileName);
    }
      
    }
    else
    {
    TCHAR szFullPathName[MAX_PATH]={0};
    TCHAR szFileName[MAX_PATH]={0};
    LPTSTR pszFilePart=szFileName;
    DWORD cchSize=sizeof(szFullPathName);
    GetFullPathName(FileData.cFileName,cchSize,szFullPathName,&pszFilePart);
    if(lstrcmpi(FileData.cFileName,pszFileName)==0)
    {
    m_list.AddString(szFullPathName);
    }
    else
                SetDlgItemText(IDC_LISTBOX,szFullPathName);
    } while(1)
    {
    if (!FindNextFile(hSearch, &FileData)) 
    {
    if (GetLastError() == ERROR_NO_MORE_FILES) 

    SetCurrentDirectory(_T(".."));
    break;

    } if(FileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
    {
    if(FileData.cFileName[0]!=_T('.'))
    {
    SetCurrentDirectory(FileData.cFileName);
    FindFile(pszFileName);
    }
    }
    else
    {
    TCHAR szFullPathName[MAX_PATH]={0};
    TCHAR szFileName[MAX_PATH]={0};
    LPTSTR pszFilePart=szFileName;
    DWORD cchSize=sizeof(szFullPathName);
    GetFullPathName(FileData.cFileName,cchSize,szFullPathName,&pszFilePart);
    if(lstrcmpi(FileData.cFileName,pszFileName)==0)
    {
    m_list.AddString(szFullPathName);
    }
    else
    SetDlgItemText(IDC_LISTBOX,szFullPathName);
    } } FindClose(hSearch);
    return TRUE;
    }使用的方法
    SetCurrentDirectory(_T("C:\\"));设置一下开始搜索的卷如D:\
    FindFile(_T("stdafx.h"));建议,给它开个线程吧,
      

  4.   

    这是我自己写的一个函数,我想按时间段查找,其中m_list是一个ListBox,m_BeginTime和m_EndTime是两个Date Time Picker,我还在对话框中还添加了一个ComboBox,其中自己加上了"c:\\ d:\\ e:\\"的字符,然后将它作为path传过来!问题是我可以找到文件了,但是时间不对,各位大侠指点一下!
    void CTimeDlg::Find(LPCTSTR lfile,CString path)
    {
    UpdateData(TRUE);
    WIN32_FIND_DATA fd;
    m_list.ResetContent();
    HANDLE hd = ::FindFirstFile(lfile,&fd);
    CFile file;
    CFileStatus status;
    path += fd.cFileName;
    //TRACE("str = %s\n",str);
    file.GetStatus(path,status);
    if (status.m_ctime >= m_Begintime && status.m_ctime <= m_Endtime)
    {
    m_list.AddString(fd.cFileName);
    }
    while (FindNextFile(hd,&fd))
    { CFile file1;
    //CString m_path = "c:\\";
    path += fd.cFileName;
            file1.GetStatus(path,status);
    if (status.m_ctime >= m_Begintime && status.m_ctime <= m_Endtime)
    {
    m_list.AddString(fd.cFileName);
    }
    }}
      

  5.   

    你把m_BeginTime和m_EndTime声明成FILETIME类型,直接和fd.ftCreationTime比较看看。
    你还忘了FindClose(hd);
      

  6.   

    如果把这两个变量声明成FILETIME类型的话又怎么和Date Time Picker联系起来呢?
      

  7.   

    你用Classwizard给Date Time Picker添加变量的时候有好几种类型可以选择,其中一种就是
    FILETIME,或者直接把m_BeginTime和m_EndTime类型改成FILETIME就可以了吧,然后在构造的时候给它们赋初值,如果你已经把它们和Date Time Picker联系的话
      

  8.   

    不好意思,前段有点忙!用Classwizard给Date Time Picker添加变量里没有这种类型吧!Value里对应的变量类型只有CTime和COldDateTime,Control里对应的只有CDateTimeCtrl而已!
      

  9.   

    你用的是vc6吧,那就只好直接把m_BeginTime和m_EndTime类型改成FILETIME就可以了吧,然后在构造的时候给它们赋初值;