2013-03-08 70 views
1

我在linux服務器上運行C++的代碼。在代碼中,我使用功能unlink(filename)來刪除文件。由代碼本身生成的臨時文件正在成功刪除。但是我手動放入的文件,我的代碼無法刪除它們。可能是什麼原因?在linux上強制刪除一個使用C++的文件

+1

「我的代碼無法刪除它們」 - 當您列出目錄內容時是否還能看到文件名?或者你是否僅僅觀察到光盤空間仍然被分配而不被回收? – 2013-03-08 11:42:30

+0

我不熟悉那個函數,但它可能是文件權限的問題。 – SamGamgee 2013-03-08 11:43:12

+0

@安德里亞斯:是的。即使在執行代碼後,這些文件仍然存在。 – sajal 2013-03-08 11:47:23

回答

9

試試這個:

#include <errno.h> 
#include <string.h> 

...

if (unlink(filename) == -1) { 
    fprintf(stderr, "File '%s' unlink error (%d): %s\n", filename, errno, strerror(errno)); 
    // or just use perror("unlink") for less customizable error message 
    // note: calling other functions before printing may change errno value 
} 

產生的錯誤信息應該透露的問題是什麼。

這裏的errno man pageunlink man page會告訴它可以返回什麼錯誤。


嗯,因爲這實際上是一個C++的問題,你可以和可能應std::cerr取代fprintf,但在這種情況下,它可能有必要先做int errtmp = errno和使用,爲避免的iostream搞亂它在它被檢查之前。

如果您想明確表示它是頂級命名空間中的符號,那麼您至少也可以編寫::unlink(filename),至少有些人甚至在沒有必要時也會考慮這種良好實踐。

+0

非常感謝@hyde這樣一個提示和美妙的解決方案。我是一個白癡,只是通過文件名而不是完整的路徑,以防手動放置文件。錯誤消息解決了我的問題。再次感謝。 :) – sajal 2013-03-08 12:04:13

+0

@sajal沒問題。增加了一些關於C++的細節,因爲我的解決方案更像C代碼。 – hyde 2013-03-08 12:08:23

+0

而不是使用fprintf,我將輸出重定向到日誌文件,所以我很安全:) – sajal 2013-03-08 12:23:19

1

,對於例如rm -f作品中,如果文件中有保護,不允許刪除它,它會嘗試更改文件保護和所有權,使用chmod()chown()功能,「有可能的方式刪除文件「。如果用戶是root或者文件實際上屬於運行程序的用戶,那麼這隻能保證能夠正常工作。

請注意,這會變得與系統有關,您無法編寫更改文件權限等的代碼,這種代碼可以在Windows和類Unix操作系統上運行,如果您想要這樣做,比如說Symbian OS,這將是如何做到的第三個變體。儘管在某些情況下可能會出現「Posix兼容」chmod()

+0

'rm -f'不會嘗試更改權限;它只是壓制一些提示和錯誤報告。但是,C++ 17提供了'std :: filesystem'(基於Boost,natch),可以讓你操縱權限。 – 2017-10-04 07:07:14

相關問題