请各位帮我写一个函数

ljhsoft 2001-09-19 11:17:30
小弟最近比较赖,什么都不想动脑子,请各位帮我写一个很简单的函数,要求如下:
功能:列出所目录下所有符合条件的文件到TString对象中
int __fastcall ReadFileName(AnsiString FilePath,bool IncludeSubDir,TStringList *ls)
参数说明:FilePaht为要列出的路径,包括文件通配符;
IncludeSubDir是否包括子目录;
ls为存放合要求的路径和文件名称。
返回值:为列出的个数;
提示: 最后使用Windows API函数FindFiles和FindNext,如果IncludeSubDir为true, 则要查找所有子目录,可以使用递归的方法实现。

分数不是问题,我有九百多分留着没有用,我会根据实现的过程和程序书写风格给分的,决不会少于50分!谢谢!

...全文
130 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang24687 2001-09-19
  • 打赏
  • 举报
回复
int __fastcall ReadFileName(AnsiString FilePath,bool IncludeSubDir,TStringList *ls)
{
int iCount = 0; //目标个数
//保存和设置当前目录
char CurrentDirectory[1024];
ZeroMemory(CurrentDirectory,1024);
GetCurrentDirectory(1024,CurrentDirectory);
String _filePath = ExtractFilePath(FilePath);
if (_filePath == "") _filePath = strcat(CurrentDirectory,"\\"); //若目录为空,取当前目录
String _fileName = ExtractFileName(FilePath);
if (_fileName == "") _fileName = "*.*"; //若文件为空,取全部文件
SetCurrentDirectory(_filePath.c_str());
WIN32_FIND_DATA _fd;
//查找符合条件的文件名
HANDLE _hd = FindFirstFile(_fileName.c_str(), &_fd );
if ( _hd != INVALID_HANDLE_VALUE )
{
do
{
if ((_fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) ==
FILE_ATTRIBUTE_DIRECTORY) continue;
iCount++;
ls->Add(_filePath + _fd.cFileName);
}
while(FindNextFile(_hd,&_fd));
}
//查找子目录
if (IncludeSubDir)
{
_hd = FindFirstFile("*.*", &_fd );
if ( _hd != INVALID_HANDLE_VALUE )
{
do
{
if ((_fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) ==
FILE_ATTRIBUTE_DIRECTORY)
{
if (strcmp(_fd.cFileName,".") == 0 || strcmp(_fd.cFileName,"..") == 0 ) continue;
String FileName2 = _filePath + _fd.cFileName;
FileName2 += "\\" + _fileName;
iCount += ReadFileName(FileName2,true,ls);
}
}
while(FindNextFile(_hd,&_fd));
}
}
FindClose(_hd);
SetCurrentDirectory(CurrentDirectory);
return iCount;
}
抬头看路 2001-09-19
  • 打赏
  • 举报
回复
int __fastcall ReadFileName(AnsiString FilePath,bool IncludeSubDir,TStringList *ls)
{

TSearchRec sr;
int iAttributes = 0;

iAttributes |= faDirectory;
if(IncludeSubDir)
if (FindFirst(ExtractFilePath(FilePath) + "*.*", iAttributes, sr) == 0)
{
do
{
if((sr.Attr & iAttributes) && sr.Name != "." && sr.Name != "..")
ReadFileName(ExtractFilePath(FilePath) + sr.Name + "\\" + ExtractFileName(FilePath), true, ls);
}while (FindNext(sr) == 0);
FindClose(sr);
}

iAttributes |= (faAnyFile ^ faDirectory);
if (FindFirst(FilePath, iAttributes, sr) == 0)
{
do
{
if((sr.Attr & iAttributes) && !(sr.Attr & faDirectory))
{
ls->Add(sr.Name);
}
}while (FindNext(sr) == 0);
FindClose(sr);
}
return 1;
}
//---------------------------------------------------------------------------
ljhsoft 2001-09-19
  • 打赏
  • 举报
回复
基本满足要求,
谢谢了,wangledong: 给你加分了。
wangledong 2001-09-19
  • 打赏
  • 举报
回复
int __fastcall ReadFileName(AnsiString FilePath,bool IncludeSubDir,TStringList *ls)
{
TSearchRec sr;
int iAttributes = 0;
iAttributes |= faAnyFile;
AnsiString Ext = ExtractFileExt ( FilePath ).UpperCase();
AnsiString Dir = ExtractFilePath ( FilePath );
AnsiString FileName = "*.*";
AnsiString OldFileName = ExtractFileName ( FilePath );
if ( !IncludeSubDir )
FileName = OldFileName;
if ( FindFirst( Dir+FileName, iAttributes, sr) == 0 )
{
do{
if ( sr.Name == "." || sr.Name == ".." )
continue;
if ( IncludeSubDir && ( sr.Attr & faDirectory ) )
ReadFileName ( Dir+sr.Name+"\\"+OldFileName, IncludeSubDir, ls );
else
{
if ( Ext == ".*" || ExtractFileExt ( sr.Name ).UpperCase() == Ext )
ls->Add ( Dir+sr.Name );
}
}while ( FindNext ( sr ) == 0 );
FindClose(sr);
}
}
ljhsoft 2001-09-19
  • 打赏
  • 举报
回复
有谁给我做,500百分相送,绝不食言。别送两个开发小工具,
1、SQL Server表存储过程分析工具;
2、TCPEasy TCP/IP发包开发模拟工具。
ljhsoft 2001-09-19
  • 打赏
  • 举报
回复
谢谢nofeal(无情)兄了,等你的好休息。
nofeal 2001-09-19
  • 打赏
  • 举报
回复
下午有时间我写一个试一下,当是锻炼。
抬头看路 2001-09-19
  • 打赏
  • 举报
回复
大家都累呀
ljhsoft 2001-09-19
  • 打赏
  • 举报
回复
每天写程序太烦了,兄弟们,帮帮我吧!救你们了。
我真的不想再动脑子了,这几天要好好休息一下。
抬头看路 2001-09-19
  • 打赏
  • 举报
回复
伙计,你也太懒了。
LuoGD 2001-09-19
  • 打赏
  • 举报
回复
我不用动手了!
wang24687 2001-09-19
  • 打赏
  • 举报
回复
函数没有义务清除TStringList的内容,它的任务是将符合条件文件名加入TStringList,并返回个数
wjzhuang 2001-09-19
  • 打赏
  • 举报
回复
呵呵~~~~~~~~~
我看到你了开发工具包了
可以拿出来让这里的兄弟共享吗?
抬头看路 2001-09-19
  • 打赏
  • 举报
回复
同意
wangledong 2001-09-19
  • 打赏
  • 举报
回复
因为有递归,所以不能清除对象的内容,因该在调用之前清空!
返回的个数可以用TStringList的Count属性来取得,没有必要返回!
ljhsoft 2001-09-19
  • 打赏
  • 举报
回复
谢了,各位都不错,但忘记了一个小问题就是:
1、函数开始前要清除对象中的内容;
2、要准确的返回找到的个数。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧