C 標準庫提供 int remove(const char *pathname) 刪除文件,成功返回 0,失敗返回 -1 並設置 errno。
#include
#include // for perror
int main(void) {
char filename[260]; // MAX_PATH 兼容
printf("請輸入要刪除的文件名(含路徑):");
if (fgets(filename, sizeof(filename), stdin) == NULL) {
fprintf(stderr, "輸入讀取失敗\n");
return EXIT_FAILURE;
}
// 去除 fgets 讀取的換行符
size_t len = strlen(filename);
if (len > 0 && filename[len - 1] == '\n')
filename[len - 1] = '\0';
if (remove(filename) == 0) {
printf("成功刪除:%s\n", filename);
} else {
perror("刪除失敗"); // 自動輸出 errno 對應的錯誤信息
}
return EXIT_SUCCESS;
}
gets:gets 不檢查緩衝區長度,極易導致緩衝區溢出,C11 已移除。改用 fgets。fgets 會保留 \n,必須手動截斷。perror:自動輸出系統錯誤描述(如 "No such file or directory"、"Permission denied"),比自定義錯誤碼更友好。EXIT_SUCCESS/EXIT_FAILURE 增強可移植性。| 平台 | 行為差異 | 應對 |
|---|---|---|
| Windows | 文件被佔用時刪除失敗,errno=EACCES |
確保文件句柄已關閉,或使用 MoveFileEx 延遲刪除 |
| Linux/Unix | 刪除目錄需 rmdir,remove 僅限文件 |
目錄刪除用 rmdir 或遞歸刪除封裝 |
| 權限不足 | 非所有者/無寫權限返回 EACCES |
檢查 access(filename, W_OK) 預判 |
C 標準庫無通配符刪除,需結合 dirent.h (POSIX) 或 FindFirstFile (Windows) 遍歷匹配後逐個 remove。
C 語言刪除文件核心是 remove(),配合 fgets 安全輸入、perror 友好報錯、標準退出碼,即構成生產級代碼。切記:永遠不要使用 gets。