繁体   English   中英

C++ 如何使用 _rmdir 删除文件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM