![](/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.