已知一个目录地址,如何找出它包含的所有文件夹。
已知一个目录地址,如何找出它包含的所有文件?
谢谢。

解决方案 »

  1.   

    bool getSubDirectoris(const AcString& szDir, AcStringList& szDirs)
    {
        if(szDir.empty())
            return false;    WIN32_FIND_DATA FindFileData;
        HANDLE hFind = ::FindFirstFile(szDir.c_str(), &FindFileData);
        if( hFind == INVALID_HANDLE_VALUE)
            return false;    bool bNext = true;
        while(bNext)
        {
            if( FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
            {
                szDirs.push_back(AcString(FindFileData.cFileName));
            }        bNext = !!::FindNextFile(hFind, &FindFileData);
        }
        szDirs.remove(TSTR("."));
        szDirs.remove(TSTR(".."));
        ::FindClose(hFind);    return true;
    }
      

  2.   

    #include "stdlib.h"
    #include "direct.h"
    #include "string.h"
    #include "io.h"
    #include "stdio.h" 
    void OpenList()
    {
    BROWSEINFO bBinfo;
    TCHAR buffer[512] = ""; //文件名
    TCHAR FullPath[512] = ""; //文件完整路径
    bBinfo.hwndOwner = m_hWnd; //设置对话框所有者句柄
    bBinfo.pidlRoot = NULL;
    bBinfo.pszDisplayName = buffer; //返回目录名缓冲区
    bBinfo.lpszTitle = "视频文件";
    //bBinfo.ulFlags = BIF_BROWSEINCLUDEFILES;//设置标志允许选择目录下的文件
    bBinfo.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS;   //设置标志只允许选择目录 
    bBinfo.lpfn = NULL;
    bBinfo.lParam = bBinfo.iImage = 0;
    ITEMIDLIST* lpDlist = ::SHBrowseForFolder(&bBinfo);
    if (lpDlist)
    {
    ::SHGetPathFromIDList(lpDlist, FullPath);
    TRACE(FullPath);
    BrowseDir(FullPath, "*.* | *.*");
    }
    }bool BrowseDir(char *dir, char *filespec)
    {
    int len = strlen(dir);
    if (dir[len-1] != '\\')
    strcat(dir, "\\");
    _chdir(dir);
    //首先查找dir中符合要求的文件
    long hFile;
    _finddata_t fileinfo;
    if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
    {
    do
    {
    //检查是不是目录
    //如果不是,则进行处理
    if (!(fileinfo.attrib & _A_SUBDIR))
    {
    char filename[_MAX_PATH];
    strcpy(filename, dir); //这里是文件夹 strcat(filename, fileinfo.name); // 这里是文件名
    }
    } while (_findnext(hFile, &fileinfo) == 0);
    _findclose(hFile);
    }
    //查找dir中的子目录
    //因为在处理dir中的文件时,派生类的ProcessFile有可能改变了
    //当前目录,因此还要重新设置当前目录为dir。
    //执行过_findfirst后,可能系统记录下了相关信息,因此改变目录
    //对_findnext没有影响。
    _chdir(dir);
    if ((hFile = _findfirst("*.*", &fileinfo)) != -1)
    {
    do
    {
    //检查是不是目录
    //如果是,再检查是不是 . 或 .. 
    //如果不是,进行迭代
    if ((fileinfo.attrib & _A_SUBDIR))
    {
    if (strcmp(fileinfo.name, ".") != 0 && strcmp
    (fileinfo.name, "..") != 0)
    {
    char subdir[_MAX_PATH];
    strcpy(subdir, dir);
    strcat(subdir, fileinfo.name);
    strcat(subdir, "\\");
    if (!BrowseDir(subdir,filespec))
    return false;
    }
    }
    } while (_findnext(hFile, &fileinfo) == 0);
    _findclose(hFile);
    }
    return true;
    }
      

  3.   

    szDirs.remove(TSTR(".")); 
        szDirs.remove(TSTR("..")); 
    这么做而不放到循环中判断,效率应该好些
      

  4.   

    string szFind = "c:\\*.*"
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind=FindFirstFile(szFind.c_str(),& FindFileData);
    if(hFind==INVALID_HANDLE_VALUE)
    return ;
    do
    {
    if(FindFileData.cFileName[0]=='.') //过滤本级目录和父目录
    continue;
    if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //如果找到的是目录,则进入此目录进行递归
    {
    }
    else //找到的是文件
    {
                    }
    }
      

  5.   

    bool MyFind(Cstring list)
    {
        CFileFind   fd; 
    CString ParDir;
    ParDir = strDir;
    bool bfind;
    if( bfind =  fd.FindFile(   ParDir   ))   
    {   
                
    fd.FindNextFile();
                    if (finder.IsDots())
    {
    continue;
    }
    if (fd.GetFilePath() == strDir)
    {

                          //////文件夹,存储
    }
                    else
                        文件,存储
    }   
    return   FALSE;  
    }