![](/img/trans.png)
[英]C++ How do I make it so my program wouldn't delete files that are in use?
[英]C++ How do I delete files with _rmdir?
我做了一个删除文件的简单程序,但是,我不知道如何删除目录。 我看到一些帖子说我需要列出该目录中的所有文件,删除这些文件,然后删除目录/文件夹本身。 但是,有人建议使用 _rmdir ,据我所知,它可以毫无问题地删除目录,但事实并非如此。 我是否仍然需要列出目录中的所有文件才能使用 _rmdir 删除它? 谢谢!
代码:
#include <iostream>
#include <string>
#include <sys/stat.h>
#include <Windows.h>
#include <direct.h>
using namespace std;
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
inline bool fileExists(const string& filepath) {
struct stat buffer;
return (stat(filepath.c_str(), &buffer) == 0);
}
int main()
{
string filePath;
string fileAttribute;
cout << "[~] Enter a path to delete: ";
getline(cin, filePath);
cout << "\n[#] Checking if path exists..";
if (fileExists(filePath) == 1)
{
if (GetFileAttributes(filePath.c_str()) == FILE_ATTRIBUTE_DIRECTORY)
{
cout << "\n[!] Directory found!";
_rmdir(filePath.c_str());
cout << "\n[#] Deleting directory..";
}
else
{
cout << "\n[!] File found!";
remove(filePath.c_str());
cout << "\n[#] Deleting file..";
}
if (fileExists(filePath) == 0)
{
SetConsoleTextAttribute(h, 10);
cout << "\n[!] Deletetion successful!";
SetConsoleTextAttribute(h, 15);
}
else
{
SetConsoleTextAttribute(h, 12);
cout << "\n[!] Deletion unsuccessful!";
SetConsoleTextAttribute(h, 15);
}
}
}
您可能需要 C++17 函数std::filesystem::remove_all递归地删除目录及其所有子目录的内容,然后删除目录本身,就像通过重复应用 POSIX 删除一样。 不遵循符号链接(删除符号链接,而不是其目标)。
编辑:正如 Eryk Sun 在评论中指出的那样,最好测试递归删除不遵循 Windows 连接点,这会导致不必要地删除连接点指向的所有内容。
我做了一个测试,使用std::filesystem::create_directory_symlink
创建一个符号链接,然后使用 WinAPI 来检查该符号链接是否成为一个连接点,据报道它确实做到了 - 一个连接点具有FILE_ATTRIBUTE_REPARSE_POINT
属性和重新解析点标记IO_REPARSE_TAG_MOUNT_POINT
。 有趣的是它还有IO_REPARSE_TAG_SYMLINK
标签。 当使用普通的DOS
命令时,我注意到链接确实被报告为一个普通的<SYMLINKD>
而不是一个<JUNCTION>
。
然后我使用MKLINK /J
创建一个连接。 该连接确实被DOS
报告为<JUNCTION>
并在其上运行std::filesystem::remove_all()
删除了它,但不是它所指向的。
我还下载了 sysinternals Junction实用程序并使用它来创建一个连接。
该结点也被DOS
报告为<JUNCTION>
,但在其上运行std::filesystem::remove_all()
有另一个效果。 它没有将其删除(或它指向)。
因此remove_all()
应该是安全的,但可能太安全了。 我没有试图找出MKLINK
连接和由 sysinternals 实用程序创建的连接之间的MKLINK
。
我是否仍然需要列出目录中的所有文件才能使用 _rmdir 删除它?
你为什么不简单地阅读文档?
它说:
_rmdir 函数删除由 dirname 指定的目录。 该目录必须为空,并且不能是当前工作目录或根目录。
任何“删除目录”功能几乎都是这种情况。 当您按键盘上的删除键时,这就是您的 Windows 资源管理器 UI 在幕后所做的事情。
这也是std::filesystem::remove
,但std::filesystem::remove_all
将为您完成所有递归。
您可以使用:
std::filesystem::remove_all("path/myDirectory");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.