一个大文件夹包含文件和子文件夹,请问如何知道他们的个数,以及相应的名称?

解决方案 »

  1.   

    FindFirstFile();
    FindNextFile();
    WIN32_FIND_DATA;
    FindFirstFile
    The FindFirstFile function searches a directory for a file whose name matches the specified filename. FindFirstFile examines subdirectory names as well as filenames. HANDLE FindFirstFile(
      LPCTSTR lpFileName,  // pointer to name of file to search for
      LPWIN32_FIND_DATA lpFindFileData 
                           // pointer to returned information
    );
     
    Parameters
    lpFileName 
    Windows 95: Pointer to a null-terminated string that specifies a valid directory or path and filename, which can contain wildcard characters (* and ?). This string must not exceed MAX_PATH characters. 
    Windows NT: Pointer to a null-terminated string that specifies a valid directory or path and filename, which can contain wildcard characters (* and ?). There is a default string size limit for paths of MAX_PATH characters. This limit is related to how the FindFirstFile function parses paths. An application can transcend this limit and send in paths longer than MAX_PATH characters by calling the wide (W) version of FindFirstFile and prepending "\\?\" to the path. The "\\?\" tells the function to turn off path parsing; it lets paths longer than MAX_PATH be used with FindFirstFileW. However, each component in the path cannot be more than MAX_PATH characters long. This also works with UNC names. The "\\?\" is ignored as part of the path. For example, "\\?\C:\myworld\private" is seen as "C:\myworld\private", and "\\?\UNC\bill_g_1\hotstuff\coolapps" is seen as "\\bill_g_1\hotstuff\coolapps". lpFindFileData 
    Pointer to the WIN32_FIND_DATA structure that receives information about the found file or subdirectory. The structure can be used in subsequent calls to the FindNextFile or FindClose function to refer to the file or subdirectory. 
    Return Values
    If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or FindClose.If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError. Res
    The FindFirstFile function opens a search handle and returns information about the first file whose name matches the specified pattern. Once the search handle is established, you can use the FindNextFile function to search for other files that match the same pattern. When the search handle is no longer needed, close it by using the FindClose function. This function searches for files by name only; it cannot be used for attribute-based searchesFindNextFile
    The FindNextFile function continues a file search from a previous call to the FindFirstFile function. BOOL FindNextFile(
      HANDLE hFindFile,  // handle to search
      LPWIN32_FIND_DATA lpFindFileData 
                         // pointer to structure for data on found file
    );
     
    Parameters
    hFindFile 
    A search handle returned by a previous call to the FindFirstFile function. 
    lpFindFileData 
    Pointer to the WIN32_FIND_DATA structure that receives information about the found file or subdirectory. The structure can be used in subsequent calls to FindNextFile to refer to the found file or directory. 
    Return Values
    If the function succeeds, the return value is nonzero.If the function fails, the return value is zero. To get extended error information, call GetLastError. If no matching files can be found, the GetLastError function returns ERROR_NO_MORE_FILES. Res
    The FindNextFile function searches for files by name only; it cannot be used for attribute-based searches. WIN32_FIND_DATA
    The WIN32_FIND_DATA structure describes a file found by the FindFirstFile, FindFirstFileEx, or FindNextFile function. typedef struct _WIN32_FIND_DATA { // wfd 
        DWORD dwFileAttributes; 
        FILETIME ftCreationTime; 
        FILETIME ftLastAccessTime; 
        FILETIME ftLastWriteTime; 
        DWORD    nFileSizeHigh; 
        DWORD    nFileSizeLow; 
        DWORD    dwReserved0; 
        DWORD    dwReserved1; 
        TCHAR    cFileName[ MAX_PATH ]; 
        TCHAR    cAlternateFileName[ 14 ]; 
    } WIN32_FIND_DATA; 
     
    Members
    dwFileAttributes 
    Specifies the file attributes of the file found. This member can be one or more of the following values: Attribute Meaning 
    FILE_ATTRIBUTE_ARCHIVE The file or directory is an archive file or directory. Applications use this attribute to  files for backup or removal. 
    FILE_ATTRIBUTE_COMPRESSED The file or directory is compressed. For a file, this means that all of the data in the file is compressed. For a directory, this means that compression is the default for newly created files and subdirectories. 
    FILE_ATTRIBUTE_DIRECTORY The handle identifies a directory. 
    FILE_ATTRIBUTE_ENCRYPTED The file or directory is encrypted. For a file, this means that all data streams are encrypted. For a directory, this means that encryption is the default for newly created files and subdirectories. 
    FILE_ATTRIBUTE_HIDDEN The file or directory is hidden. It is not included in an ordinary directory listing. 
    FILE_ATTRIBUTE_NORMAL The file or directory has no other attributes set. This attribute is valid only if used alone. 
    FILE_ATTRIBUTE_OFFLINE The file data is not immediately available. Indicates that the file data has been physically moved to offline storage. 
    FILE_ATTRIBUTE_READONLY The file or directory is read-only. Applications can read the file but cannot write to it or delete it. In the case of a directory, applications cannot delete it. 
    FILE_ATTRIBUTE_REPARSE_POINT The file has an associated reparse point. 
    FILE_ATTRIBUTE_SPARSE_FILE The file is a sparse file. 
    FILE_ATTRIBUTE_SYSTEM The file or directory is part of the operating system or is used exclusively by the operating system. 
    FILE_ATTRIBUTE_TEMPORARY The file is being used for temporary storage. File systems attempt to keep all of the data in memory for quicker access, rather than flushing it back to mass storage. A temporary file should be deleted by the application as soon as it is no longer needed. 用上述三个函数写个递归函数,然后根据返回的WIN32_FIND_DATA的dwFileAttributes判断是目录(FILE_ATTRIBUTE_DIRECTORY)还是文件(不是目录就是文件)。
      

  2.   

    用遍历
    HRESULT CFileManagerSYSDlg::FindDirectory(LPTSTR path)
    {
    WIN32_FIND_DATA wfd;
    HANDLE handle = NULL;
    int hr =1;

    TCHAR tempFileFind[MAX_PATH];
    sprintf(tempFileFind,"%s\\*.*",path);
    handle =(HANDLE) FindFirstFile(tempFileFind,&wfd);
    if(handle)
    while(hr)
    {
    if(strcmp(wfd.cFileName, ".") && strcmp(wfd.cFileName,".."))
    {
    TCHAR foundFileName[MAX_PATH];
    strcpy(foundFileName,wfd.cFileName);
    if(wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
    {
    TCHAR tempDir[200];
    sprintf(tempDir,"%s\\%s",path,foundFileName);
    FindDirectory(tempDir);
    }
    else
    {
    TCHAR tempFileName[200];
    sprintf(tempFileName,"%s\\%s",path,foundFileName);
    InsertList(1, tempFileName, "0");
    }
    }
    hr = FindNextFile(handle,&wfd);
    }
    FindClose(handle);
    return true;
    }void CFileManagerSYSDlg::OnBtnbrowse() 
    {
    // TODO: Add your control notification handler code here
    BROWSEINFO bi;  
        char dispname[MAX_PATH], path[MAX_PATH], searchfolder[MAX_PATH], title[MAX_PATH], createtime[30];  
        ITEMIDLIST * pidl;
    CString filetitle;
    BOOL bRet;
    FILETIME * time;
    SYSTEMTIME * systime; time = new FILETIME;
    systime = new SYSTEMTIME;
    memset(dispname, 0, MAX_PATH);
    memset(path, 0, MAX_PATH);
    memset(searchfolder, 0, MAX_PATH);
    memset(title, 0, MAX_PATH);
    memset(createtime, 0, 30);    bi.hwndOwner = 0;  
        bi.pidlRoot = 0;  
        bi.pszDisplayName = dispname;  
        bi.lpszTitle = "选择文件夹";  
        bi.ulFlags = BIF_RETURNONLYFSDIRS;  
        bi.lpfn = 0;
        bi.lParam = 0;  
        bi.iImage = 0;  
        
        if (pidl = SHBrowseForFolder(&bi)) //弹出文件夹浏览窗口,并选取目录
        {
    DelList();
    SHGetPathFromIDList(pidl, path);  
            GetDlgItem(IDC_BROWSE)->SetWindowText(path);
    FindDirectory(path);
        }}
      

  3.   

    用递归调用的方法,下面是我的例子,可以搜索不同类型后缀的文件,很有用:
    用下面的函数也可以得到所有的文件夹和文件。
    m_arrFileType用来记录要搜索的文件类型:
             theApp.m_arrFileType.RemoveAll();
    theApp.m_arrFileType.Add ("*.sgml");//包括了sgm、gml、sgml共三种。
    theApp.m_arrFileType.Add ("*.sgm");//包括了sgm、gml、sgml共三种。
    theApp.m_arrFileType.Add ("*.gml");//包括了sgm、gml、sgml共三种。
    theApp.m_arrFileType.Add ("*.sgc");
    theApp.m_arrFileType.Add ("*.oa3");
    theApp.m_arrFileType.Add ("*.nmjr");
    theApp.m_arrFileType.Add ("*.phd");
    theApp.m_arrFileType.Add ("*.xml");//如果sPath为目录,就继续检查他的是否仍然有下一级子目录; 01、2、22
    //参数bInTheSameDir表示目标文件的路径是否与源文件一致。
    void SearchDirectory(LPCTSTR Path)
    {
    CString sPath=Path;
    if(sPath.Right(1)!='\\')
    {
    sPath += "\\";
    }
    FindSgmlFiles(sPath);
    sPath+="*.*";
    CFileFind ff;
    BOOL bWorking = ff.FindFile(sPath);
    if (!bWorking) return;

    while (bWorking)
    {
    bWorking = ff.FindNextFile();
    if (ff.IsDots())
    continue;

    if (ff.IsDirectory()){
    CString str=ff.GetFilePath();
    str+='\\';
    SearchDirectory(str);
    }
    }
    }//如果sPath为文件,就自动搜索是否符合后缀要求,符合就添加到列表中; 01、2、22
    void FindSgmlFiles(CString sPath)
    {
    CString sDestPath="";
    CString sExt;//记录后缀
    int nExtLen = 0;
    CString sFileName = "";
    int size=theApp.m_arrFileType.GetSize();
    for(int i=0;i<size;i++){
    CString TmpPath;
    TmpPath=sPath;
    sExt = theApp.m_arrFileType[i];//加上对文件类型的判断
    TmpPath+=sExt;
    sExt = sExt.Mid(1);//去掉“*”.
    nExtLen = sExt.GetLength();
    CFileFind ff;
    BOOL bWorking = ff.FindFile(TmpPath);
    if (!bWorking && i<size ) continue;
    else if(!bWorking && i>=size) return; while (bWorking)
    {
    bWorking = ff.FindNextFile();

    if (ff.IsDots())
    {
    continue;
    }
    if (ff.IsDirectory()){ //this is impossible.
    continue;
    }
    if (!ff.IsDirectory()) //file
    {
    sFileName = ff.GetFilePath();
    if(sFileName.Right(nExtLen)==sExt)//确保后缀绝对一致。
    {
    theApp.m_arrFileName.Add(sFileName);
    }
    }
    }
    }
    }