sailor19840309
驱动牛犊
驱动牛犊
  • 注册日期2005-03-23
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1865回复:14

急啊,请教文件查找

楼主#
更多 发布于:2005-05-26 08:17
我写了一个在目录CDirName下(包括其子目录下)搜索文件CFileName的程序,可是执行起来总是不对,找到的文件根本就不是我要找的,请各位大大指点迷津,急啊
//搜索文件并将搜索得到的文件显示在列表框中,CDirName形如\"C:\\aa\",CFileName形如\"aa.txt\"
void CUsbDlg::OnSearch(CString CFileName,CString CDirName)
{
CFileFind ff;
CString szDir = CDirName;
int k=0;

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

szDir += \"*\";

BOOL res = ff.FindFile(szDir);
while(res)
{
res = ff.FindNextFile();
if(ff.IsDirectory() && !ff.IsDots())
{
//如果是一个子目录,用递归继续往深一层找
OnSearch(ff.GetFilePath(),CFileName);
}
else if(!ff.IsDirectory() && (!ff.IsDots()))
{
CString str1=ff.GetFilePath();
CString str2=ff.GetRoot();
str2=str2+\"\\\\\"+CFileName;
if(!stricmp(str1,str1))
{
CListBox* p = (CListBox*)GetDlgItem(IDC_LIST1);
p->InsertString(k,str1);
k++;
}
}
}
ff.Close();//关闭
m_static4.SetWindowText(\"Have finded k files in all\");
}
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-26 08:57
1:OnSearch(ff.GetFilePath(),CFileName);
参数反了。
2:虽然不确定,但你最好完全按MSDN上所写,把szDir += \"*\";改为szDir += \"*.*\";
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
sailor19840309
驱动牛犊
驱动牛犊
  • 注册日期2005-03-23
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-26 09:15
还是不对,他执行的功能是浏览这个文件夹下的所有文件,而不是查找指定文件,不知道问题在哪儿
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-26 09:43
else if(!ff.IsDirectory() && (!ff.IsDots()))
{
CString str1=ff.GetFilePath();
CString str2=ff.GetRoot();
str2=str2+\"\\\\\"+CFileName;
if(!stricmp(str1,str1))
{
CListBox* p = (CListBox*)GetDlgItem(IDC_LIST1);
p->InsertString(k,str1);
k++;
}
}
}
ff.Close();//关闭
m_static4.SetWindowText(\"Have finded k files in all\");
}


改为:
else if(!ff.IsDirectory() && (!ff.IsDots()))
{
if( ff.GetFileName() == CFileName )
{
CListBox* p = (CListBox*)GetDlgItem(IDC_LIST1);
p->InsertString( k,ff.GetFilePath() );
k++;
}
}
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-26 09:44
真没面子,没看到这一句:
if(!stricmp(str1,str1))
楼主,给我块豆腐,让我撞死吧!

[编辑 -  5/26/05 by  maqian]
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
sailor19840309
驱动牛犊
驱动牛犊
  • 注册日期2005-03-23
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-26 09:52
谢谢了,搞定了
如果要加入对文件夹的查找,应该怎样做,如何判断CFileName是否文件夹呢
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-26 09:55
IsDirectory难道不是现成的函数?
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
sailor19840309
驱动牛犊
驱动牛犊
  • 注册日期2005-03-23
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-26 10:00
我的意思是如何仅仅通过字符串CFileName进行判断
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-26 10:10
DWORD dwAttr = GetFileAttributes( CFileName );
if( ( dwAttr != INVALID_FILE_ATTRIBUTES ) )
&& ( dwAttr & FILE_ATTRIBUTE_DIRECTORY ) )
//是文件夹

[编辑 -  5/26/05 by  maqian]
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
sailor19840309
驱动牛犊
驱动牛犊
  • 注册日期2005-03-23
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-05-26 10:52
搞定了,再次谢谢大大的帮忙
不过INVALID_FILE_ATTRIBUTES 好象是不存在的.直接
if( dwAttr & FILE_ATTRIBUTE_DIRECTORY ) 就好了
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-05-26 11:00
#define INVALID_FILE_ATTRIBUTES (DWORD(-1))
如果找不到可自己定义。这个判断是一定要写的。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
sailor19840309
驱动牛犊
驱动牛犊
  • 注册日期2005-03-23
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-05-27 13:08
void CUsbDlg::OnSearch(CString CFileName,CString CDirName)
{
CFileFind ff;
CString szDir = CDirName;
int k=0;
int l=0;

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

szDir += \"*.*\";
DWORD dwAttr = GetFileAttributes( CFileName );
if((dwAttr != INVALID_FILE_ATTRIBUTES) && ( dwAttr & FILE_ATTRIBUTE_DIRECTORY ) )
{
bool res = ff.FindFile(szDir);
while(res)
{
res = ff.FindNextFile();
if(ff.IsDirectory() && !ff.IsDots())
{
if( ff.GetFileName() == CFileName )
{
CListBox* p = (CListBox*)GetDlgItem(IDC_LIST1);
p->InsertString( l,ff.GetFilePath());
l++;
OnSearch(CFileName,ff.GetFilePath());//递归搜索
}
}
}
ff.Close();//关闭

}
else
{
bool res = ff.FindFile(szDir);
while(res)
{
res = ff.FindNextFile();
if(ff.IsDirectory() && !ff.IsDots())
{
//如果是一个子目录,用递归继续往深一层找
OnSearch(CFileName,ff.GetFilePath());//递归搜索
}
else if(!ff.IsDirectory() && (!ff.IsDots()))
{
if( ff.GetFileName() == CFileName )
{
CListBox* p = (CListBox*)GetDlgItem(IDC_LIST1);
p->InsertString( k,ff.GetFilePath());
k++;
}
}
}
}

ff.Close();//关闭
}
我在程序里面加入了对文件夹的查找,可是还是只能对文件进行查找,不能查找文件夹,为什么

[编辑 -  5/27/05 by  sailor19840309]
maqian
驱动中牛
驱动中牛
  • 注册日期2002-08-07
  • 最后登录2014-09-16
  • 粉丝2
  • 关注1
  • 积分12分
  • 威望120点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-05-27 13:35
DWORD dwAttr = GetFileAttributes( CFileName );
if( ( dwAttr != INVALID_FILE_ATTRIBUTES ) )
&& ( dwAttr & FILE_ATTRIBUTE_DIRECTORY ) )
//是文件夹

 

我这是举个例子,真正给GetFileAttributes的参数应该是带全路径的,例如ff.GetFilePath()。
五花马,千金裘,呼儿将出换美酒。 我不喝酒,喝可乐。
csea1997
驱动牛犊
驱动牛犊
  • 注册日期2005-02-03
  • 最后登录2006-04-23
  • 粉丝0
  • 关注0
  • 积分63分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-05-29 15:21
能不能把整个工程贴上来看看啊?这个代码只是其中的一部分吧.
HELLO,我基本不太懂,不过要马上开始了,时间不等人啊
sailor19840309
驱动牛犊
驱动牛犊
  • 注册日期2005-03-23
  • 最后登录2005-05-31
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-05-30 10:22
问题已经解决了
多谢各位的帮忙
游客

返回顶部