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.txtf.txth.txt 确实被删除,但 e.txtg.txt 没有。 第二个和第四个文件始终保留而不被删除。如果我创建了具有 7 个文件名的新向量,我的代码将删除第 1 个、第 3 个、第 5 个和第 7 个文件。

我想知道为什么?我的代码的哪一部分忽略了所有其他文件?

PS。我正在使用 Visual Studio 2012。

更新:

remove() 函数是 windows.h 头文件中的标准函数。我不写我自己的。 vector&lt;string&gt;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 有一个合理的调试器。恕我直言,比本网站提供的人工调试服务要好得多。 请将ab 声明为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但OP有vector。标准删除不会与 OP 发布的代码一起编译。 是的,我刚刚意识到我错过了第一行,我的错,但至少他现在有一些参考。

以上是关于remove() 函数删除所有其他文件的主要内容,如果未能解决你的问题,请参考以下文章

boostremoveall文件不存在时

学习笔记24文件的其他操作

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函数删除所有模式匹配的字符串