remove() 函数删除所有其他文件
Posted
技术标签:
【中文标题】remove() 函数删除所有其他文件【英文标题】:remove() function deletes every other file 【发布时间】:2013-08-29 15:16:30 【问题描述】:我有 vector<string> files
的五个文件名:
C:\Directory\d.txt
C:\Directory\e.txt
C:\Directory\f.txt
C:\Directory\g.txt
C:\Directory\h.txt
当我尝试使用此代码显示内容和大小files
时:
int a = files.size();
int b = 0;
cout<<a<<endl;;
for(b; b<a ;b++)
cout<<files[b]<<endl;
它工作正常 - 文件名和矢量大小都可以。 现在我必须删除这些文件,所以我修改了我的代码:
int a = files.size();
int b = 0;
for(b; b<a ;b++)
if(remove(files[b]) == 0)
cout<<GetLastError();
cout<<"\nRemoved: "<<files[b]<<endl;
但它不起作用 - 应用程序因错误而崩溃:
调试断言失败!
程序:C:\Windows\system32\MSVCP110D.dll 文件:c:\program 文件 (x86)\microsoft visual studio 11.0\vc\include\vector 行:1140
表达式:向量下标超出范围
有关您的程序如何导致断言失败的信息, 请参阅有关断言的 Visual C++ 文档。
(按重试调试应用程序)
GetLastError 成功删除后返回代码 18(没有更多文件。)。
输出:
18 已移除:C:\Directory\d.txt
18 已移除:C:\Directory\f.txt
18 删除:C:\Directory\h.txt
文件:d.txt
、f.txt
和 h.txt
确实被删除,但 e.txt
和 g.txt
没有。
第二个和第四个文件始终保留而不被删除。如果我创建了具有 7 个文件名的新向量,我的代码将删除第 1 个、第 3 个、第 5 个和第 7 个文件。
我想知道为什么?我的代码的哪一部分忽略了所有其他文件?
PS。我正在使用 Visual Studio 2012。
更新:
remove() 函数是 windows.h 头文件中的标准函数。我不写我自己的。
vector<string>files
应该没问题 - 我用 files.push_back("C:\\Directory\d.txt")
添加项目 - 像这样五次。
@ChrisCM 帮我删除文件:当我替换行时:
if(remove(files[b]) == 0)
用他的台词:
if(remove(files[files.size() - 1]) == 0)
它删除了所有文件,但应用程序仍然崩溃并出现错误“调试断言失败!...”(整个消息在这篇文章的顶部)。
【问题讨论】:
您的阵列是否正确构建? 我认为我们需要查看remove
的代码。如果 remove 应该是该名称的标准 C++ 函数,则发布的代码将无法编译。在这种情况下,我们需要查看真实代码。
你需要向我们展示你是如何分配你的数组的,还请逐行浏览你的代码,你可以看到当它崩溃时 b 是什么,以及它在 remove(files[b] ) 或 cout
Visual Studio 有一个合理的调试器。恕我直言,比本网站提供的人工调试服务要好得多。
请将a
和b
声明为size_t
而不是int
。并不是说这是问题的根源。
【参考方案1】:
我发现您的删除代码可能正在重新调整数组中项目的位置。示例:
012345
删除 2 后,您有
01345
不是
01_345
因此,您希望删除数组 files.size() 次的第 0 个元素(或者可能是最后一个元素更佳)。所以替换这一行:
if(remove(files[b]) == 0)
有了这个:
if(remove(files[0]) == 0)
或最佳
if(remove(files[files.size() - 1]) == 0)
但这当然取决于您对删除的实施,但鉴于您对症状的解释,我发现这种解释很可能。
您还需要调整 for 循环以使用此逻辑,否则您将尝试访问向量中不再存在的值:
while(files.size())
cout << "\nRemoving: " << files.back() << endl;
remove(files.back());
//Add your error handling here if you wish.
【讨论】:
我也首先想到了这一点,但似乎他将向量中的值传递给remove()
而不是实际向量,因此他的代码无法更改向量本身。
向量可以是类变量/全局变量(希望不是),在这种情况下,他需要的只是要从向量中拉出的项目和/或对项目的引用。我们需要看看他的 remove() 函数。
当然,我的理由是他没有隐藏比发布的内容大 10 倍或更复杂的代码 :D 但是当然,关键是 remove()
的实现。
@ChrisCM 是的,你是对的 - 将我的行替换为你的行后,应用程序删除了所有文件,但仍然显示错误“调试断言失败!...”(在我的第一篇文章中)。 PS。 remove() 函数是 windows.h 标头的标准函数。
您还需要删除程序中的 files[b] 引用。如果你想打印出你删除的文件,你应该在删除之前打印出来,而不是基于 b 的值。查看修改。【参考方案2】:
只是一个简短的说明,我对标准 remove()
不起作用的评论感到困惑,所以我在 VS2012 中做了一个快速测试项目,这似乎有效:
// RemoveTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <Windows.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
std::vector<char*> files;
files.push_back("C:\\test\\a.txt");
files.push_back("C:\\test\\b.txt");
files.push_back("C:\\test\\c.txt");
int a = files.size();
int b = 0;
for(b; b<a ;b++)
if(remove(files[b]) == 0)
cout<<GetLastError();
cout<<"\nRemoved: "<<files[b]<<endl;
所以你的remove()
一定有问题。
【讨论】:
不同之处在于你有vector以上是关于remove() 函数删除所有其他文件的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用fs包的dir_delete函数删除指定的文件目录(remove the directory)举一反三file_delete函数link_delete函数可以用来删除文件和文件夹
Bash[One Liner]-Remove实用程序:删除除Ext以外的所有文件
R语言使用str_remove函数和str_remove_all函数删除模式匹配的字符串:str_remove函数删除第一个模式匹配的字符串str_remove_all函数删除所有模式匹配的字符串