VC怎么获取一个路径下的目录和文件
要求:规定这个路径下最多只有两级目录,比如:c:\test\dir,也只有dir文件夹下存有文件,没有目录
现在需要把文件目录保存起来,然后把下面的文件名也保存起来,搞一个二维数组存放这两个值
strArray[0][0]={"test\\dir","a.txt"}
strArray[0][1]={"test\\dir","b.txt"}
strArray[0][2]={"test\\dir","c.txt"}
......
反正是相应的路径对应以下的文件,我只是把要求说出来,不知道大家还有没有好的意见,也就是更好的保存方法,给个具体的程序给我参考一下,主要是目录怎么对应问题,我还没想出好的方法区别哪两个目录是一起的

解决方案 »

  1.   

    用map类模板,或者自定义一个结构也可,保存文件名和路径指针,同一目录下的文件可以用同一路径指针。
      

  2.   

    结构体转换成char*等排列传输
      

  3.   

    long handle; 
    struct _finddata_t filestruct;   
    char path_search[_MAX_PATH]; 
    handle = _findfirst("目录",&filestruct); 
    if((handle == -1)) return; 
    if( ::GetFileAttributes(filestruct.name)& FILE_ATTRIBUTE_DIRECTORY ) 

    if( filestruct.name[0] != '.' ) 

    _chdir(filestruct.name); 
    Search_Directory(szFilename); 
    _chdir(".."); 


    else

    if( !stricmp(filestruct.name, szFilename) ) 

    strcat(path_search,"\\"); 
    strcat(path_search,filestruct.name); 
    MessageBox(path_search);


    while(!(_findnext(handle,&filestruct))) 

      if( ::GetFileAttributes(filestruct.name) &FILE_ATTRIBUTE_DIRECTORY ) 

    if(*filestruct.name != '.') 

    _chdir(filestruct.name); 
    Search_Directory(szFilename); 
    _chdir(".."); 

    else 

    if(!stricmp(filestruct.name,szFilename)) 

    _getcwd(path_search,_MAX_PATH); 
    strcat(path_search,"\\"); 
    strcat(path_search,filestruct.name); 
    MessageBox(path_search); 



    _findclose(handle); 
      

  4.   

    遍历文件夹并建成目录树:
    http://www.vckbase.com/document/viewdoc/?id=620基本原理是用了函数的递归调用,再加入参数跟踪。我在调试程序的时候,跟踪发现:程序只有在遍历完一个目录下所有子目录后,才返回同级的目录。这样便可以用参数的值来决定目录的层次。(1)在对话框上添加树型控件,选择Style中Has Buttons、Has Lines、Lines At Root。
    (2)定义变量:HTREEITEM strRoot;  //根目录
    HTREEITEM strHTFir; //第一层
    HTREEITEM strHTSec; //第二层
    HTREEITEM strHtThi; //第三层
    HTREEITEM strHtFor; //第四层
    HTREEITEM strHtFif; //第五层
    // 没有找到更好的方法,所以只能这样来显示,估计一下大约能用到几层,如果找到好方法,请告诉我,非常感谢!
    HTREEITEM strHtEnd; //文件目录(3)添加遍历文件夹的函数BrowseFile(int CallNum, CString strFile)
    //CalNum-用来记录第几层目录,strFile-路径
    并添加以下内容:void CFileTreeDlg::BrowseFile(int CallNum, CString strFile)
    {
    CallNum++;
    CFileFind ff;
    CString szDir = strFile;

    if(szDir.Right(1) != "\\")
    szDir += "\\";

    szDir += "*.*";

    BOOL res = ff.FindFile(szDir);
    while(res)
    {
    res = ff.FindNextFile();
    if(ff.IsDirectory() && !ff.IsDots())//目录是文件夹
    {
    //如果是一个子目录,用递归继续往深一层找 CString strPath = ff.GetFilePath(); //得到路径,做为递归调用的开始
    CString strTitle = ff.GetFileTitle();//得到目录名,做为树控的结点
    int i =0;
    switch(CallNum)
    {
    case 1:
    strHTFir = m_FileTree.InsertItem(strTitle,0,0,NULL);
    break;
    case 2:
    strHTSec = m_FileTree.InsertItem(strTitle,0,0,strHTFir);
    break;
    case 3:
    strHtThi = m_FileTree.InsertItem(strTitle,0,0,strHTSec);
    break;
    case 4:
    strHtFor = m_FileTree.InsertItem(strTitle,0,0,strHtThi);
    break;
    default:
    strHtFif = m_FileTree.InsertItem(strTitle,0,0,strHtFor);
    break;
    }
    BrowseFile(CallNum,strPath);//递归调用
    }
    else if(!ff.IsDirectory() && !ff.IsDots())//到达最低层的文件
    {
    //显示当前访问的文件
    CString strPath;
    CString strTitle;
    strPath = ff.GetFilePath();
    strTitle = ff.GetFileTitle();
    switch(CallNum)
    {
    case 1:
    strRoot = m_FileTree.InsertItem(strTitle,0,0,NULL);
    break;
    case 2:
    strHtEnd = m_FileTree.InsertItem(strTitle,0,0,strHTFir);
    break;
    case 3:
    strHtEnd = m_FileTree.InsertItem(strTitle,0,0,strHTSec);
    break;
    case 4:
    strHtEnd = m_FileTree.InsertItem(strTitle,0,0,strHtThi);
    break;
    case 5:
    strHtEnd = m_FileTree.InsertItem(strTitle,0,0,strHtFor);
    break;
    default:
    strHtEnd = m_FileTree.InsertItem(strTitle,0,0,strHtFif);
    break;
    }
    }
    }
    ff.Close();//关闭
    }(4)在OnInitDialog()函数中设置树控件的图标并调用自定义函数BrowseFile()BOOL CFileTreeDlg::OnInitDialog()
    {
    m_iImageList.Create(24, 24, TRUE,1, 0); //创建图标链
    HICON hIcon = NULL;
    hIcon = (HICON)::LoadImage(::AfxGetInstanceHandle(), 
    MAKEINTRESOURCE(IDI_KEBIAO), IMAGE_ICON, 24, 24, 0);
    m_iImageList.Add(hIcon);
    m_FileTree.SetImageList ( &m_iImageList,TVSIL_NORMAL );
    BrowseFile(0,"课程表");//遍历"课程表"文件夹内的所有目录
    }
      

  5.   

    我刚做过从ftp上下载档案的例子,用链表
      

  6.   

    用CFileFind     IsDots()  IsDirectory()
      

  7.   

    以前写过一个类来专门处理
    Directory.h文件#pragma comment(lib,"Shlwapi.lib")#include <afxcoll.h>
    #include <vector>using namespace std;/*
     * 目录操作类
    作者:松鼠
    时间:2008-12-14 20:57

     */
    class Directory  
    {
    public:
    Directory();
    virtual ~Directory();
    public:
    static CString GetCurrentDirectory(); //获取当前应用程序文件夹C:\Windows\System\ 
    static BOOL Exist(const CString& folder); //验证文件夹是否存在
    static BOOL Exist(const char* folder); //验证文件夹是否存在
    static BOOL Exist(const wchar_t* folder); //验证文件夹是否存在
    static CStringList* GetFiles(const CString& folder); //获取指定文件夹下面的所有文件(不包含子文件夹)
    static CStringList* GetDirectorys(const CString& folder); //获取指定目录的子目录列表
    static void GetFiles(const CString& folder,vector<CString> *l); //Get files
    static void GetAllFiles(const CString& folder,vector<CString>* ext);//获取指定文件夹下面的所有文件(包含子文件夹里面的文件)};
    Directory.cpp文件
    #include "Directory.h"
    #include <io.h>
    #include <stdio.h>Directory::Directory()
    {}Directory::~Directory()
    {}/*
    验证指定文件夹是否存在
    */
    BOOL Directory::Exist(const CString& folder)
    {
    return _access((LPCTSTR)folder,00) == 0;
    }/*
     * 验证文件夹是否存在
     */
    BOOL Directory::Exist(const wchar_t* folder)
    {
    return _waccess(folder,00) == 0;
    }/*
     * 验证文件夹是否存在
     */
    BOOL Directory::Exist(const char* folder)
    {
    return _access(folder,00) == 0;
    }/*
    获取当前应用程序所在目录名称
    return:
    C:\Windows\System\
    */
    CString Directory::GetCurrentDirectory()
    {
    char path[_MAX_PATH]; ::GetCurrentDirectory(_MAX_PATH,path);
    strcat(path,"\\");
    return CString(path);
    }/*
     * 获取指定目录的子目录列表
    参数:
    folder C:\Windows\
    说明:
    需要外部释放内存
     */
    CStringList* Directory::GetDirectorys(const CString& folder)
    {
    CStringList* list = new CStringList();
    CFileFind fileFind;
    BOOL re = fileFind.FindFile(folder + "*.*"); if (re)
    {
    while (re)
    {
    re = fileFind.FindNextFile();
    if (fileFind.IsDots()) continue;
    if (fileFind.IsDirectory())
    {
    list->AddTail(fileFind.GetFileName());
    }
    }
    }
    return list;
    }/*
    Get files from folder
    param:
    folder C:\Windows\
    说明:
    需要外部释放内存
    2008-12-13:修复读取第一个文件错误
    */
    void Directory::GetFiles(const CString& folder,vector<CString> *l)
    {
    CFileFind fileFind;
    BOOL re = fileFind.FindFile(folder + "*.*"); 
    if(re)
    {
    while(re)
    {
    re = fileFind.FindNextFile();
    if(fileFind.IsDots())continue;
    l->push_back(fileFind.GetFilePath());
    }
    }
    }/*
     * 获取指定文件夹下面的所有文件(不包含子文件夹)
    参数:
    folder C:\Windows\
    说明:
    需要外部释放内存
     */
    CStringList* Directory::GetFiles(const CString& folder)
    {
    CFileFind fileFind;
    CStringList* list = new CStringList();
    BOOL re = fileFind.FindFile(folder + "*.*");

    if (re)
    {
    while(re)
    {
    re = fileFind.FindNextFile();
    if(fileFind.IsDots()) continue;
    if (fileFind.IsDirectory()) continue;
    list->AddTail(fileFind.GetFilePath());
    }
    }
    return list;
    }/*
    获取指定文件夹下面的所有文件(包括子文件夹里面的文件)
    param:
    folder C:\Windows\
    ext *.exe
    */
    void Directory::GetAllFiles(const CString& folder,vector<CString>* l)
    {
    CStringList* folderList = GetDirectorys(folder);
    POSITION posf; //进入到最底层文件夹
    for( posf = folderList->GetHeadPosition(); posf != NULL; )
    {
    GetAllFiles(folder + folderList->GetNext(posf) + "\\",l);
    }
    //获取当前目录文件
    CStringList* fileList = GetFiles(folder + "*.*"); for (POSITION pos = fileList->GetHeadPosition() ; pos != NULL;)
    {
    l->push_back(fileList->GetNext(pos));
    }
    fileList->RemoveAll();
    delete fileList;
    folderList->RemoveAll();
    delete folderList;
    }
      

  8.   

    调用实例:
    CString folder = "E:\\电影\\";
    CStringList* fileList;fileList = Directory::GetFiles(folder);
    delete fileList;//释放内存
      

  9.   

    This small program recurses every directory on the C:\ drive and prints the name of the directory.
    #include <afx.h>
    #include <iostream>using namespace std;void Recurse(LPCTSTR pstr)
    {
       CFileFind finder;   // build a string with wildcards
       CString strWildcard(pstr);
       strWildcard += _T("\\*.*");   // start working for files
       BOOL bWorking = finder.FindFile(strWildcard);   while (bWorking)
       {
          bWorking = finder.FindNextFile();      // skip . and .. files; otherwise, we'd
          // recur infinitely!      if (finder.IsDots())
             continue;      // if it's a directory, recursively search it      if (finder.IsDirectory())
          {
             CString str = finder.GetFilePath();
             cout << (LPCTSTR) str << endl;
             Recurse(str);
          }
       }   finder.Close();
    }void main()
    {
       if (!AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), 0)
          cout << "panic!" << endl;
       else
          Recurse(_T("C:"));
    }
      

  10.   

    参考jixingzhong提供的资料,自己重新改了下,就差不多了
    #include <afxtempl.h>
    CArray<CString,CString&> strSaveFile;
    CString strDir;
    void MyBrowseFile(int CallNum, CString strFile)
    {
    CallNum++;
    CFileFind ff;
    CString szDir = strFile;

    CString strFileName;
    CStringArray strDirFileName; if(szDir.Right(1) != "\\")
    szDir += "\\";

    szDir += "*.*";
    CString str;
    BOOL res = ff.FindFile(szDir);
    while(res)
    {
    res = ff.FindNextFile();
    if(ff.IsDirectory() && !ff.IsDots())
    {
    //如果是一个子目录,用递归继续往深一层找
    CString strPath = ff.GetFilePath();
    CString strTitle = ff.GetFileTitle();
    int i =0;
    switch(CallNum)
    {
    case 1:
    strDir = strTitle;
    break;
    case 2:
    strDir = "|" + strDir + "\\" + strTitle ;
    strSaveFile.Add(strDir);
    break;
    default:
    break;
    }
    MyBrowseFile(CallNum,strPath);
    }
    else if(!ff.IsDirectory() && !ff.IsDots())
    {
    //显示当前访问的文件
    CString strPath;
    CString strTitle;
    strPath = ff.GetFilePath();
    strTitle = ff.GetFileName();
    switch(CallNum)
    {
    case 1:
    break;
    case 2:
    break;
    case 3:
    strFileName = strTitle;
    //str = strDir + "#" + strFileName + "|";
    str = "#" + strFileName;
    strSaveFile.Add(str);
    TRACE("%s",str);
    str = "";
    break;
    default:
    break;
    }
    }
    }
    ff.Close();//关闭
    }
    void CFileTreeDlg::OnOK() 
    {
    MyBrowseFile(0,"c:\\222");
    CString strArray;
    int iSize=strSaveFile.GetSize();
    for(int i=0; i<iSize; i++)
    {
    CString str = strSaveFile[i];
    strArray += str;
    }
    TRACE("%s",strArray);
    }得到结果是:|用来区分一个目录下的所有目录和文件,#用来区分文件名
    |11\\22#lmy.txt#win.ini|12\\22#lmy2.txt#win2.ini|13\\22#lmy3.txt#win3.ini|14\\22#lmy4.txt#win4.ini|15\\22