一、删除函数
在前面的容器相关分析中,对std::remove及其相关的技术进行过对比分析。其实在删除函数在C/C++中有很多情况下应用,关键是名字还一样,这就可能导致很多初级的开发者感到困惑,甚至有可能产生一些错误的用法。所以,本文就是以删除文件为切入点进行分析说明它们之间的不同。
二、不同的remove函数作用
不同的库中remove函数功能有所不同,下面就分别展开分析:
- std::remove
std::remove有两种情况,一种是在标准的库中的算法库中,用于删除容器相关的内容,应用它需要包含头文件。但比较让开发者容易混淆的是,在C的标准库中,也有一个相同名称的函数,它是可以用来删除指定文件的。这个一定要弄清楚,特别是相关的头文件要区别清楚。在实际应用的时候,要掌握好二者的应用场景。同时,尽量不要使用using namespae std,防止出现歧义。 - std::filesystem中的remove
它主要用来删除指定的文件和空的目录。注意,只能是空的目录。如果想删除文件夹,需要使用remove_all这个函数
三、例程
根据上面的分析,再看下面的代码就容易理解了。
#include <algorithm>
#include <cstdlib>
#include <filesystem>
#include <iostream>
#include <vector>
using namespace std;
namespace fs = std::filesystem;
bool testRemoveVec() {
std::vector<std::string> vec = {"temp1.iso", "temp2.iso", "temp3.iso"};
const auto it = std::remove(vec.begin(), vec.end(), "temp1.iso");
std::cerr << "deleting file: "
<< "temp1.iso" << std::endl;
return true;
}
bool removeUseStdRemove(const std::string &filename) {
if (std::remove(filename.c_str()) != 0) {
std::cerr << "Error deleting file: " << filename << std::endl;
} else {
std::cerr << "Temporary file deleted: " << filename << std::endl;
}
return true;
}
bool removeUseFileSystem(const std::string &filename) {
std::error_code ec;
if (fs::remove(filename, ec)) {
std::cerr << "removeUseFileSystem deleting file OK: " << filename << ",err code:" << ec.message() << std::endl;
} else {
std::cerr << "removeUseFileSystem deleting file ERR: " << filename << ",err code:" << ec.message() << std::endl;
}
return true;
}
bool removeDirectory(const string &path) {
try {
if (filesystem::exists(path) && filesystem::is_directory(path)) {
filesystem::remove_all(path);
std::cerr << "remove path ok:" << path << std::endl;
return true;
} else {
cerr << "Error: Directory does not exist." << endl;
return false;
}
} catch (const filesystem::filesystem_error &e) {
cerr << "Filesystem error: " << e.what() << endl;
return false;
} catch (const exception &e) {
cerr << "General error: " << e.what() << endl;
return false;
}
}
int main() {
bool bRet = removeDirectory("/home/test/project/removeTest/test");
bRet = removeUseFileSystem("/home/test/project/removeTest/build/data.raw");
bRet = removeUseStdRemove("/home/test/project/removeTest/build/data0.raw");
testRemoveVec();
return 0;
}
特别要注意代码中std::remove的具体应用所表现出来的不同。
四、总结
C和C++的编程往往混合在一起,这样,出现一些名称上的冲突是不可避免的。做为一个开发者,最重要的是明白这些冲突的来龙去脉。这些应用本身并没有什么难度,但如果不明白其中的细节,就会在应用中产生一些误用。当然,也有可能误打误撞应用成功的,却无法解释其中的原理,形成错误的认知,从而影响在以后的开发。
C++中remove函数详解

1985





