我想在C中做一個功能來刪除臨時文件夾的所有內容並刪除文件夾。
雖然我已經成功創建了循環遍歷文件和刪除文件夾的代碼(這非常簡單),但我無法使用unlink刪除文件。
這裏是我使用的代碼:C - 取消鏈接/刪除會產生空格的文件名錯誤
int delete_folder(char *foldername) {
DIR *dp;
struct dirent *ep;
dp=opendir(foldername);
if (dp!=NULL) {
readdir(dp); readdir(dp);
while (ep=readdir(dp)) {
char* cell = concatenate(concatenate(foldername, "\\"), "Bayesian Estimation.xlsx");//ep->d_name);
printf("%s\n", cell);
remove(cell);
printf("%s\n", strerror(errno));
}
closedir(dp);
}
if (!rmdir(foldername)) {return(0);} else {return(-1);}
}
,我寫的是全功能的所有文件,但是那些文件名中包含空格的代碼。經過一些測試後,我可以保證取消鏈接功能可以消除文件夾中的所有文件(即使文件名中包含特殊字符的文件),但如果文件名包含空格,將會失敗(但是,對於同一個文件,如果刪除空間),此功能再次工作)。
有其他人遇到過這個問題嗎?而且,更重要的是,它可以解決/散佈嗎?
(即使我直接引入空間轉義序列,問題仍然存在)
unlink提供的錯誤是「沒有這樣的文件或目錄」(ENOENT)。請注意,該文件確實位於引用的位置(可通過在變量單元格中輸出正確文件名的代碼進行驗證),並且如果使用刪除功能而不是取消鏈接,也會發生此錯誤。
PS:函數連接是我自己製作的函數,它輸出兩個輸入字符串的連接。
編輯: 該代碼是在Windows代碼塊中編寫的。
這裏的連擊功能代碼:
char* concatenate(char *str1, char *str2) {
int a1 = strlen(str1), a2 = strlen(str2); char* str3[a1+a2+1];
snprintf(str3, a1+a2+2, "%s%s", str1, str2);
return(str3);
}
雖然你說,這是可能的(容易)內存泄漏是正確的,功能輸入和輸出是生成的代碼,並僅供個人使用,因此沒有太大的理由擔心它(沒有真正需要防止代碼被愚弄)。
'concatenate'是否使用'malloc()'來分配連接字符串?他們如何獲得免費()ed? – Barmar
@Barmar,這顯然是一個測試用例,正如_actual_ rest-of-line在評論之後的事實所證明的那樣。在任何情況下,_show_ us'concatenate()',_we_無法確定它是否像廣告一樣工作。 – paxdiablo
我想不出有什麼理由解決這個問題。 'unlink'和'remove'不會解析文件名,除非找到'/'目錄分隔符。 – Barmar