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"}
......
反正是相应的路径对应以下的文件,我只是把要求说出来,不知道大家还有没有好的意见,也就是更好的保存方法,给个具体的程序给我参考一下,主要是目录怎么对应问题,我还没想出好的方法区别哪两个目录是一起的
要求:规定这个路径下最多只有两级目录,比如: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"}
......
反正是相应的路径对应以下的文件,我只是把要求说出来,不知道大家还有没有好的意见,也就是更好的保存方法,给个具体的程序给我参考一下,主要是目录怎么对应问题,我还没想出好的方法区别哪两个目录是一起的
解决方案 »
- HEX TO ASCII 如何实现
- SNMP++使用中出现问题:SNMP: Variable does not exist
- 怎么屏蔽系统弹出的ToolTip。。急在线等
- CEdit 中EN_CHANGE 和EN_Update怎么使用 啊
- MFC listctrl的item选中状态下的背景如何变成半透明?
- 请问如何将一个普通c函数指针转换为IDispatch * 类型?
- datagrid中怎么删除选中的那列的数据啊,急··················
- 在一个小区铺网线,设计一个程序进行要求成本代价最低。送分。
- 关于将完成端口用于网络游戏开发的一些问题。
- 请问,获得dll参数的过程。(汇编高手请进)
- 关于在listctrl中添加checkbox
- CInternetSession的问题
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);
}
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,"课程表");//遍历"课程表"文件夹内的所有目录
}
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;
}
CString folder = "E:\\电影\\";
CStringList* fileList;fileList = Directory::GetFiles(folder);
delete fileList;//释放内存
#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:"));
}
#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