C++ Go語(yǔ)言實(shí)現(xiàn)將windows和linux文件刪除至回收站
C++
在C++中,將文件移動(dòng)到回收站的實(shí)現(xiàn)在Linux和Windows平臺(tái)上是不同的。首先,我會(huì)為你提供在Windows平臺(tái)上實(shí)現(xiàn)的代碼示例,然后再提供Linux平臺(tái)上的對(duì)應(yīng)實(shí)現(xiàn)。
Windows平臺(tái)
在Windows平臺(tái)上,你可以使用SHFileOperation函數(shù)來(lái)將文件移動(dòng)到回收站。這個(gè)函數(shù)定義在Shellapi.h頭文件中。以下是一個(gè)簡(jiǎn)單的示例
#include <windows.h> #include <shellapi.h> void moveToRecycleBin(const char* filePath) { SHFILEOPSTRUCT fileOp; ZeroMemory(&fileOp, sizeof(fileOp)); fileOp.wFunc = FO_DELETE; fileOp.pFrom = filePath; fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION; SHFileOperation(&fileOp); } int main() { moveToRecycleBin("C:\\path\\to\\your\\file.txt"); return 0; }
Linux平臺(tái)
在Linux系統(tǒng)中,將文件“刪除”到回收站的操作實(shí)際上并不是直接刪除文件,而是將其移動(dòng)到一個(gè)特定的目錄(通常是用戶目錄下的一個(gè)隱藏文件夾)。這是因?yàn)長(zhǎng)inux沒(méi)有一個(gè)統(tǒng)一的、系統(tǒng)級(jí)的回收站功能,不像Windows的回收站那樣。因此,將文件“刪除”到回收站實(shí)際上是把文件從它原來(lái)的位置移動(dòng)到這個(gè)隱藏的回收站目錄。
#include <iostream> #include <fstream> #include <string> #include <sys/stat.h> #include <unistd.h> bool moveToTrash(const std::string& filePath) { const char* homeDir = getenv("HOME"); if (!homeDir) { std::cerr << "Error: HOME environment variable not set." << std::endl; return false; } std::string trashFilesPath = std::string(homeDir) + "/.local/share/Trash/files/"; std::string trashInfoPath = std::string(homeDir) + "/.local/share/Trash/info/"; std::string baseName = filePath.substr(filePath.find_last_of('/') + 1); std::string destFilePath = trashFilesPath + baseName; std::string destInfoPath = trashInfoPath + baseName + ".trashinfo"; // 創(chuàng)建回收站文件和信息目錄(如果不存在) mkdir(trashFilesPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); mkdir(trashInfoPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); // 寫(xiě)入.trashinfo文件 std::ofstream trashInfoFile(destInfoPath); if (!trashInfoFile) { std::cerr << "Error: Unable to create trash info file." << std::endl; return false; } trashInfoFile << "[Trash Info]\nPath=" << filePath << "\nDeletionDate=" << /* 獲取當(dāng)前日期和時(shí)間的代碼 */ "\n"; trashInfoFile.close(); // 移動(dòng)文件到回收站 if (rename(filePath.c_str(), destFilePath.c_str()) != 0) { perror("Error moving file to trash"); return false; } return true; } int main() { std::string filePath = "/path/to/your/file.txt"; // 替換為要?jiǎng)h除的文件路徑 if (!moveToTrash(filePath)) { return 1; } return 0; }
跨平臺(tái),代碼合并
要在同一個(gè)程序中同時(shí)支持Windows和Linux平臺(tái)的文件刪除到回收站的功能,我們可以使用預(yù)處理器指令來(lái)區(qū)分操作系統(tǒng),并在每個(gè)平臺(tái)上執(zhí)行相應(yīng)的操作。同時(shí),為了確保代碼的穩(wěn)定性,我們需要添加適當(dāng)?shù)腻e(cuò)誤處理來(lái)避免程序崩潰即使在刪除失敗的情況下。以下是一個(gè)跨平臺(tái)的示例實(shí)現(xiàn)
#include <iostream> #include <string> #include <cstdlib> #include <cstdio> #ifdef _WIN32 #include <windows.h> #include <shellapi.h> #endif #ifdef __linux__ #include <sys/stat.h> #include <unistd.h> #endif bool moveToRecycleBin(const std::string& filePath) { #ifdef _WIN32 // Windows 實(shí)現(xiàn) SHFILEOPSTRUCT shfos; ZeroMemory(&shfos, sizeof(shfos)); shfos.wFunc = FO_DELETE; shfos.pFrom = filePath.c_str(); shfos.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION; return SHFileOperation(&shfos) == 0; #elif __linux__ // Linux 實(shí)現(xiàn) const char* homeDir = getenv("HOME"); if (!homeDir) { std::cerr << "Error: HOME environment variable not set." << std::endl; return false; } std::string trashFilesPath = std::string(homeDir) + "/.local/share/Trash/files/"; std::string trashInfoPath = std::string(homeDir) + "/.local/share/Trash/info/"; std::string baseName = filePath.substr(filePath.find_last_of('/') + 1); std::string destFilePath = trashFilesPath + baseName; std::string destInfoPath = trashInfoPath + baseName + ".trashinfo"; mkdir(trashFilesPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); mkdir(trashInfoPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); std::ofstream trashInfoFile(destInfoPath); if (!trashInfoFile) { std::cerr << "Error: Unable to create trash info file." << std::endl; return false; } trashInfoFile << "[Trash Info]\nPath=" << filePath << "\nDeletionDate=" << /* 獲取當(dāng)前日期和時(shí)間的代碼 */ "\n"; trashInfoFile.close(); return rename(filePath.c_str(), destFilePath.c_str()) == 0; #else std::cerr << "Unsupported platform." << std::endl; return false; #endif } int main() { std::string filePath = "/path/to/your/file.txt"; // 替換為要?jiǎng)h除的文件路徑 if (!moveToRecycleBin(filePath)) { std::cerr << "Failed to move file to recycle bin." << std::endl; return 1; } return 0; }
Go
在Go語(yǔ)言中,將文件移動(dòng)到回收站的功能比較復(fù)雜,因?yàn)镚o本身沒(méi)有提供直接操作系統(tǒng)回收站的API。這意味著你需要調(diào)用操作系統(tǒng)特定的功能。對(duì)于Windows,你可以使用系統(tǒng)調(diào)用來(lái)調(diào)用相應(yīng)的Windows API。而在Linux上,由于標(biāo)準(zhǔn)的“回收站”是桌面環(huán)境特定的,通常的做法是將文件移動(dòng)到一個(gè)特定的目錄(例如,基于FreeDesktop.org規(guī)范的“回收站”目錄)。
實(shí)現(xiàn)步驟
平臺(tái)檢測(cè):首先,你需要檢測(cè)運(yùn)行程序的平臺(tái),以便確定使用哪種方法。
Windows實(shí)現(xiàn):在Windows上,你可以使用syscall包來(lái)調(diào)用SHFileOperation函數(shù),它是Windows API的一部分,用于執(zhí)行文件操作,包括刪除到回收站。
Linux實(shí)現(xiàn):在Linux上,你可以簡(jiǎn)單地將文件移動(dòng)到特定的回收站目錄(通常是~/.local/share/Trash/files/),但這不是標(biāo)準(zhǔn)化的,可能會(huì)根據(jù)不同的桌面環(huán)境有所變化。
Go語(yǔ)言實(shí)現(xiàn)示例
以下是一個(gè)簡(jiǎn)化的Go語(yǔ)言實(shí)現(xiàn)示例。請(qǐng)注意,這個(gè)示例僅適用于演示目的,并不包括詳細(xì)的錯(cuò)誤處理和復(fù)雜的操作系統(tǒng)交互。
package main import ( "fmt" "os" "path/filepath" "runtime" "syscall" "unsafe" ) // Windows API常量 const ( FO_DELETE = 0x0003 FOF_ALLOWUNDO = 0x0040 FOF_NOCONFIRMATION = 0x0010 ) type SHFILEOPSTRUCT struct { hwnd syscall.Handle wFunc uint32 pFrom *uint16 pTo *uint16 fFlags uint16 fAnyOps bool hNameMappings uintptr lpszProgressTitle *uint16 } func moveToRecycleBin(filePath string) error { switch runtime.GOOS { case "windows": // Windows實(shí)現(xiàn) shFileOp := &SHFILEOPSTRUCT{ wFunc: FO_DELETE, pFrom: syscall.StringToUTF16Ptr(filePath + "\x00"), fFlags: FOF_ALLOWUNDO | FOF_NOCONFIRMATION, } shfileopProc, err := syscall.LoadDLL("shell32.dll").FindProc("SHFileOperationW") if err != nil { return err } ret, _, _ := shfileopProc.Call(uintptr(unsafe.Pointer(shFileOp))) if ret != 0 { return fmt.Errorf("SHFileOperationW failed: return value %d", ret) } case "linux": // Linux實(shí)現(xiàn) homeDir, err := os.UserHomeDir() if err != nil { return err } trashPath := filepath.Join(homeDir, ".local/share/Trash/files") if _, err := os.Stat(trashPath); os.IsNotExist(err) { if err := os.MkdirAll(trashPath, 0755); err != nil { return err } } baseName := filepath.Base(filePath) destPath := filepath.Join(trashPath, baseName) err = os.Rename(filePath, destPath) if err != nil { return err } default: return fmt.Errorf("unsupported platform") } return nil } func main() { err := moveToRecycleBin("C:\\path\\to\\your\\file.txt") // 替換為你要?jiǎng)h除的文件路徑 if err != nil { fmt.Println("Error:", err) os.Exit(1) } }
平臺(tái)檢測(cè):通過(guò)runtime.GOOS檢測(cè)運(yùn)行的操作系統(tǒng)。
Windows實(shí)現(xiàn):(注釋掉的部分)需要使用syscall包來(lái)調(diào)用Windows API。這是一個(gè)比較高級(jí)和復(fù)雜的操作,需要對(duì)Windows API有深入了解。
Linux實(shí)現(xiàn):簡(jiǎn)單地將文件移動(dòng)到預(yù)定義的回收站目錄。
錯(cuò)誤處理:在實(shí)際應(yīng)用中,應(yīng)該添加更多的錯(cuò)誤處理邏輯以處理各種可能的異常情況。
go單獨(dú)的windows版本實(shí)現(xiàn)
在Go語(yǔ)言中實(shí)現(xiàn)將文件移動(dòng)到Windows回收站的功能相對(duì)復(fù)雜,因?yàn)樾枰褂肳indows API。這通常涉及到調(diào)用SHFileOperation函數(shù)。在Go中,你可以通過(guò)syscall包來(lái)進(jìn)行系統(tǒng)調(diào)用。以下是一個(gè)可能的實(shí)現(xiàn)方式,但請(qǐng)注意,這需要對(duì)Windows API有一定的了解,并且可能需要根據(jù)你的具體需求進(jìn)行調(diào)整。
package main import ( "fmt" "os" "syscall" "unsafe" ) const ( FO_DELETE = 0x0003 FOF_ALLOWUNDO = 0x0040 FOF_NOCONFIRMATION = 0x0010 ) type SHFILEOPSTRUCT struct { hwnd syscall.Handle wFunc uint32 pFrom *uint16 pTo *uint16 fFlags uint16 fAnyOps bool hNameMappings uintptr lpszProgressTitle *uint16 } func moveToRecycleBin(filePath string) error { shFileOp := &SHFILEOPSTRUCT{ wFunc: FO_DELETE, pFrom: syscall.StringToUTF16Ptr(filePath + "\x00"), fFlags: FOF_ALLOWUNDO | FOF_NOCONFIRMATION, } shfileopProc, err := syscall.LoadDLL("shell32.dll").FindProc("SHFileOperationW") if err != nil { return err } ret, _, _ := shfileopProc.Call(uintptr(unsafe.Pointer(shFileOp))) if ret != 0 { return fmt.Errorf("SHFileOperationW failed: return value %d", ret) } return nil } func main() { err := moveToRecycleBin("C:\\path\\to\\your\\file.txt") // 替換為要?jiǎng)h除的文件路徑 if err != nil { fmt.Println("Error:", err) os.Exit(1) } }
代碼解釋
1.常量定義:定義了一些需要用到的常量,比如FO_DELETE(用于刪除操作)和FOF_ALLOWUNDO(允許撤銷)。
2.SHFILEOPSTRUCT結(jié)構(gòu)體:這個(gè)結(jié)構(gòu)體用于SHFileOperation函數(shù)的參數(shù),包含了操作類型、源文件路徑、目標(biāo)文件路徑(在這個(gè)例子中不使用),以及其他標(biāo)志。
3.moveToRecycleBin函數(shù):
- 將文件路徑轉(zhuǎn)換為以空字符結(jié)尾的UTF-16字符串。
- 加載shell32.dll動(dòng)態(tài)鏈接庫(kù)并查找SHFileOperationW函數(shù)。
- 調(diào)用SHFileOperationW函數(shù)來(lái)執(zhí)行刪除操作。如果返回值不為0,則表示操作失敗。
4.錯(cuò)誤處理:如果加載DLL或查找函數(shù)失敗,或者函數(shù)執(zhí)行返回錯(cuò)誤,函數(shù)會(huì)返回相應(yīng)的錯(cuò)誤。
以上就是C++ Go語(yǔ)言實(shí)現(xiàn)將windows和linux文件刪除至回收站的詳細(xì)內(nèi)容,更多關(guān)于C++ Go文件刪除至回收站的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MacOS上Homebrew?安裝、配置、更改國(guó)內(nèi)鏡像源及使用圖文詳解
Homebrew是一個(gè)強(qiáng)大的包管理器,適用于macOS和Linux系統(tǒng),可以簡(jiǎn)化軟件的安裝、升級(jí)和卸載過(guò)程,它包括brew、homebrew-core、homebrew-cask和homebrew-bottles四個(gè)主要部分,通過(guò)tap和cask可以擴(kuò)展功能,安裝圖形界面應(yīng)用,Homebrew還提供了各種命令來(lái)管理和維護(hù)已安裝的軟件包2024-11-11OpenManus安裝與部署中的常見(jiàn)問(wèn)題解決方案與避坑指南
本文主要分享一下OpenManus使用過(guò)程中的寶貴解決方案,從環(huán)境配置、模型選擇到功能優(yōu)化,全方位提供避坑指南,助你少走彎路,充分發(fā)揮這個(gè)強(qiáng)大平臺(tái)的潛力2025-03-03GitHub 熱門:別再用 print 輸出來(lái)調(diào)試代碼了
本文給大家分享GitHub 熱門:別再用 print 輸出來(lái)調(diào)試代碼了的詳細(xì)解說(shuō),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04Blazor實(shí)現(xiàn)組件嵌套傳遞值的示例詳解
這篇文章主要為大家詳細(xì)介紹了Blazor實(shí)現(xiàn)組件嵌套傳遞值的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2023-02-02超實(shí)用Internet Download Manager(IDM)破解注冊(cè)碼,全版本通用
IDM下載器是一個(gè)十分好用的文件下載工具。IDM下載器它能夠幫助你提升5倍的下載速度,強(qiáng)大的續(xù)傳功能,讓你不再擔(dān)心因網(wǎng)絡(luò)問(wèn)題、計(jì)算機(jī)宕機(jī)、停電等原因所造成的數(shù)據(jù)不全問(wèn)題,下面小編給大家?guī)?lái)了Internet Download Manager(IDM)破解注冊(cè)碼,感興趣的朋友參考下吧2023-01-01測(cè)試框架JUnit VS TestNG對(duì)比分析
這篇文章主要為大家介紹了測(cè)試框架JUnit VS TestNG對(duì)比分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07curl和wget檢測(cè)網(wǎng)頁(yè)狀態(tài)的區(qū)別
curl和Wget在linux日常使用中非常常見(jiàn),它們都可以向服務(wù)器發(fā)出請(qǐng)求,curl和Wget的一個(gè)最明顯的區(qū)別是:默認(rèn)情況下Wget將查詢的網(wǎng)頁(yè)保存到系統(tǒng),而?curl將其顯示在終端輸出中但不保存它,curl的使用率比Wget多得多2025-04-04