用SDK的方式怎样查找出一个指定盘里的所有文件名????
如题............. 问题点数:20、回复次数:5Top
1 楼Stefine(CSDN最菜滴猩猩)回复于 2006-07-02 14:40:12 得分 10
先参考MFC封装的那个类(CDiskObject )吧, 反正你要在SDK中调用的话,也只要导入afxwin.h来调用MFC的类就得了,这里大多都是SDK函数!( CDiskObject 在codeproject里可以下载到)
那类好像有问题,不过后来被我改过来了
我帖出一段你需要的代码:
BOOL CDiskObject::EnumAllFilesWithFilter( const CString& filter,const CString& sourceDirectory, CStringArray& files )
/* ============================================================
Function : CDiskObject::EnumAllFiles
Description : Returns, recursively, the fully qualified
names of all files matching the filter
found under "sourceDirectory".
Access : Public
Return : BOOL - "TRUE" if OK.
Parameters : CString filter - Filter for files
to find
CString sourceDirectory - Root dir
CStringArray& files - output list
of all files
found
Usage : Call to get a filtered list of all files in
a directory tree.
============================================================*/
{
CStringArray dirs;
CStringArray dirfiles;
BOOL result = FALSE;
CString indir = sourceDirectory;
QualifyPath( indir );
//原来的代码
/*if( EnumFilesInDirectoryWithFilter( filter, indir, dirfiles, EF_FULLY_QUALIFIED ) )
{
int max0 = (int) dirfiles.GetSize( );
for( int i = 0 ; i < max0 ; i++ )
{
CString file = dirfiles[ i ];
Trigger( file );
files.Add( file );
}
result = EnumAllDirectories( sourceDirectory, dirs );
if( result )
{
int max1 = (int) dirs.GetSize( );
for( int t = 0 ; t < max1 ; t++ )
{
CString dir = dirs[ t ];
QualifyPath( dir );
if( EnumFilesInDirectoryWithFilter( filter, dir, dirfiles, EF_FULLY_QUALIFIED ) )
{
int max2 = (int) dirfiles.GetSize( );
for( int i = 0 ; i < max2 ; i++ )
{
CString file = dirfiles[ i ];
Trigger( file );
files.Add( file );
}
}
}
}
}*/
//我自己修改后的代码,可实现添加文件夹里所有文件,包含子文件夹里的文件
result = EnumFilesInDirectoryWithFilter( filter, indir, dirfiles, EF_FULLY_QUALIFIED );
if( result )
{
int max0 = (int) dirfiles.GetSize( );
for( int i = 0 ; i < max0 ; i++ )
{
CString file = dirfiles[ i ];
Trigger( file );
files.Add( file );
}
}
result = EnumAllDirectories( sourceDirectory, dirs ) ;
if( result )
{
int max1 = (int) dirs.GetSize( );
for( int t = 0 ; t < max1 ; t++ )
{
CString dir = dirs[ t ];
QualifyPath( dir );
dirfiles.RemoveAll();
if( EnumFilesInDirectoryWithFilter( filter, dir, dirfiles, EF_FULLY_QUALIFIED ) )
{
int max2 = (int) dirfiles.GetSize( );
for( int i = 0 ; i < max2 ; i++ )
{
CString file = dirfiles[ i ];
Trigger( file );
files.Add( file );
}
}
}
}
return result;
}
在这里面它调用了另外的三个函数,不帖了,加我QQ:276244858,我传这个类给你Top
2 楼chengchenz(春眠闻啼鸟,处处不觉晓)回复于 2006-07-02 14:53:41 得分 5
好像是用FindFirstFile和FindNextFile
检查WIN32FINDDATA, 如果是目录就递归进去Top
3 楼hurryboylqs()回复于 2006-07-02 18:17:01 得分 0
楼上正解........Top
4 楼Stefine(CSDN最菜滴猩猩)回复于 2006-07-03 12:43:30 得分 0
呵呵,我供的那几个函数只是对这的封装而已
WIN32_FIND_DATA ff;
HANDLE findhandle = FindFirstFile( sourceFiles, &ff );
if( findhandle != INVALID_HANDLE_VALUE)
{
BOOL res = TRUE;
while( res)
{
// We only want directories
if( ( ff.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) && _tcscmp( ff.cFileName, _T( "." ) ) && _tcscmp( ff.cFileName, _T( ".." ) ) )
{
directories.Add( ff.cFileName );
Trigger( ff.cFileName );
}
if( res )
res = FindNextFile( findhandle, &ff );
else
result = FALSE;
}
FindClose( findhandle );
}
else
{
// Set error message
SetSystemErrorMessage( ::GetLastError( ), sourceFiles );
result = FALSE;
}
都是这种模型
Top
5 楼jszj(老板说mis部不是赚钱的部门...)回复于 2006-07-03 13:38:00 得分 5
FindFirstFile()与FindNextFile()配合即可Top




