簡體   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