关于FindNextFile的问题,急求解答

lsxsxs 2010-06-04 10:38:50
我用CFileFind找一个文件夹里的文件,然后FindNextFile,得到的是第一个文件,但是当我再次FindNextFile时,如果我那个文件夹里另外只还有一个文件的话,它就找不到了。比如我是找到一个文件,如果它后面还有文件,就把它删了,这样那个文件夹里就只剩下一个文件。而现在这样,文件夹里始终剩了两个文件。这是怎么回事啊。谁能指点一下啊,谢谢了。

CFileFind fileFind;
CString FullPathName;
FullPathName = "Pic1\\*.jpg";
bool bFind = fileFind.FindFile(FullPathName);
if(bFind)
{
while(bFind)
{
bFind = fileFind.FindNextFileA();
filename = fileFind.GetFileName();
bool cfind = fileFind.FindNextFileA();
if(!cfind)
{
break;
}
if(cfind)
{
CString filename1 = "Pic1\\" + filename;
CFile::Remove(filename1);
}
}
}
...全文
829 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-06-04
  • 打赏
  • 举报
回复
你需要修改一下逻辑
比如进入while之前先获取一次文件名
保存在PreFile里
然后进while
每次FindNextFile一次放在CurFile里
处理完之后过一下PreFile=CurFile
zwfgdlc 2010-06-04
  • 打赏
  • 举报
回复
这个似乎是以文件名来排序的。没法改。
lsxsxs 2010-06-04
  • 打赏
  • 举报
回复
我似乎知道我错在哪里了,我刚刚测试了一下,怎么执行程序的第一个FindNextFile找到的是最后一个文件。之后才是从第一个文件开始的。问一下,有什么方法是找一个文件夹中第一个文件的。
lsxsxs 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xianglitian 的回复:]
我觉得应该是逻辑的问题吧
你看看是不是这样
比如文件夹下有1,2,3,4四个文件
while进去
第一个FindNextFileA得到了1
第二个FindNextFileA得到了2
然后你删掉了1
然后接着while
第一个FindNextFileA得到了3
第一个FindNextFileA得到了4
然后你删掉了3
然后就出了while循环
可是2你没删啊
[/Quote]
向大哥分析得很正确,最开始我就犯了这个错误,不过后来我用了个笨办法来处理,我处理完第二张的时候我不FindNextFile了,我直接FindFile(“2.jpg”),然后处理,删除等操作,处理完之后跳到最外层,也就是重新再来读文件夹,再来读第一个文件。就是处理2张之后我就等于是关闭了程序重新开始。
lsxsxs 2010-06-04
  • 打赏
  • 举报
回复
主要的不是删除,因为我是要对文件进行逐个的处理,处理完之后才删除,所以我需要的是得到每一个文件,我主要搞不明白的是,我文件夹里明明有2个文件,为什么FindNextFileA却找不到第二个文件。也就是有一个文件,也就是文件夹中的最后一个文件,我用FindNextFileA似乎是无法找到的
向立天 2010-06-04
  • 打赏
  • 举报
回复
我觉得应该是逻辑的问题吧
你看看是不是这样
比如文件夹下有1,2,3,4四个文件
while进去
第一个FindNextFileA得到了1
第二个FindNextFileA得到了2
然后你删掉了1
然后接着while
第一个FindNextFileA得到了3
第一个FindNextFileA得到了4
然后你删掉了3
然后就出了while循环
可是2你没删啊
zwfgdlc 2010-06-04
  • 打赏
  • 举报
回复

FullPathName = fileFind.GetFilePath();
CFile::Remove(FullPathName);

试了下。
用GetFilePath()才可以,fileFind.GetFileName()只是获取到文件名,没有包含路径;
不能被删除。
lsxsxs 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]
C/C++ code
bFind = fileFind.FindNextFileA();
filename = fileFind.GetFileName();
bool cfind = fileFind.FindNextFileA();

刚发现
你试试只用一个fileFind.FindNextFileA();
[/Quote]
第一个 fileFind.FindNextFileA();找到的是第一个文件,但是由于我要判断后面一个文件的文件名,所以我再用了一个fileFind.FindNextFileA();但是第二个返回的值是false,而我文件夹里面那个文件之后的确还有一个文件
Eleven 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lsxsxs 的回复:]
引用 7 楼 visualeleven 的回复:
例子是要删除掉Pic1里所有。jpg文件???

其实我是逐个进行处理,然后删除,不是全部删除,因为处理的时候要判断后面的一个文件,所以要先看后面的文件是什么名字。但我想要的结果是最后只剩下一张图片,而现在却一直是2张
[/Quote]


// 保留F:\Pic1目录下的1.jpg文件,其他的jpg文件都删除
CFileFind fileFind;
CString FullPathName = _T("F:\\Pic1\\*.jpg");
BOOL bFind = fileFind.FindFile(FullPathName);

CString strReverse = _T("1.jpg");

while(bFind)
{
bFind = fileFind.FindNextFile();
if(strReverse != fileFind.GetFileName())
{
CFile::Remove(fileFind.GetFilePath());
}
}
向立天 2010-06-04
  • 打赏
  • 举报
回复
        bFind = fileFind.FindNextFileA();
filename = fileFind.GetFileName();
bool cfind = fileFind.FindNextFileA();

刚发现
你试试只用一个fileFind.FindNextFileA();
lsxsxs 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 visualeleven 的回复:]
例子是要删除掉Pic1里所有。jpg文件???
[/Quote]
其实我是逐个进行处理,然后删除,不是全部删除,因为处理的时候要判断后面的一个文件,所以要先看后面的文件是什么名字。但我想要的结果是最后只剩下一张图片,而现在却一直是2张
Eleven 2010-06-04
  • 打赏
  • 举报
回复

CFileFind fileFind;
CString FullPathName = _T("F:\\Pic1\\*.jpg");
BOOL bFind = fileFind.FindFile(FullPathName);

while(bFind)
{
bFind = fileFind.FindNextFile();
CFile::Remove(fileFind.GetFilePath());
}
lsxsxs 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zwfgdlc 的回复:]
觉得你的有点不对,试下这样。

C/C++ code

CFileFind fileFind;
CString FullPathName;
FullPathName = "Pic1\\*.jpg";
bool bFind = fileFind.FindFile(FullPathName);

if(bFind)
{
do
{
if (fil……
[/Quote]
应该不得行哦,我之前试了一下,如果不首先FindNextFile一次的话,根本不能GetFileName哦,运行直接报错
Eleven 2010-06-04
  • 打赏
  • 举报
回复
例子是要删除掉Pic1里所有。jpg文件???
lsxsxs 2010-06-04
  • 打赏
  • 举报
回复
我5楼的回复是回复3楼的
lsxsxs 2010-06-04
  • 打赏
  • 举报
回复
这个是行的,只要里面文件还很多的时候都行,就是最后剩下两个了就不行了,第二个FindNextFile就返回false了,然后跳出循环了。所以就一直剩了2个文件在里面,而我想的只是剩一个文件在里面
zwfgdlc 2010-06-04
  • 打赏
  • 举报
回复
觉得你的有点不对,试下这样。

CFileFind fileFind;
CString FullPathName;
FullPathName = "Pic1\\*.jpg";
bool bFind = fileFind.FindFile(FullPathName);

if(bFind)
{
do
{
if (fileFind.IsDots())
continue;

FullPathName = fileFind.GetFileName();
CFile::Remove(FullPathName);
bFind = fileFind.FindNextFileA();
}while(bFind);
}
向立天 2010-06-04
  • 打赏
  • 举报
回复
你独立运行一下CFile::Remove(filename1);看看能不能删除文件
lsxsxs 2010-06-04
  • 打赏
  • 举报
回复
如果文件夹中只有2个文件了的话,bool cfind = fileFind.FindNextFileA();就会返回false,然后就一直这样了
soswaidao 2010-06-04
  • 打赏
  • 举报
回复
链表出了问题

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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