关于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);
}
}
}
...全文
909 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
  • 打赏
  • 举报
回复
链表出了问题
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 用户账户控制(UAC)白名单的配置 Windows7环境中 UAC(User Account Control,用户帐户控制)是由微软在Windows Vista版本中推出的一项旨在增强系统安全性的创新技术,该技术强制要求用户在执行可能干扰计算机正常运作的操作或进行更改会波及其他用户设置的变动前,必须提供相应的权限或管理员密码进行验证。通过对这些操作启动前进行授权确认,UAC能够有效阻止恶意软件及间谍软件在未获授权的状态下于计算机内进行安装或实施修改。 自从Vista版本问世以来,微软便开始推行这一全新的安全机制,可视为对系统安全防护的显著提升。尽管UAC确实能够在一定程度上对某些非法程序起到防御作用,但与此同时,这一功能也给众多用户带来了诸多不便。 因此,许多用户开始探寻是否存在类似于白名单的功能,以便将那些值得信赖的程序直接赋予运行权限。事实上,这类功能确实存在,不过微软并未将其作为标准配置提供。 网络上关于此问题的绝大多数建议都是建议禁用UAC,这种说法显然缺乏针对性,因为若用户希望禁用此功能,本就不会提出相关疑问。 通过运用微软官方发布的Microsoft Application Compatibility Toolkit 5.6版本,可以将信任的程序纳入系统白名单范畴。 获取Application Compatibility Toolkit 安装程序成功后会出现三个可执行文件 以管理员身份启动Compatibility Administrator 在Custom DataBases部分创建新的数据库,并添加一个Application Fix(在下方空白处点击右键,选择...

16,550

社区成员

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

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

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