2010-09-26 111 views
7

我想知道如何檢查我是否有權限寫入文件夾。檢查在Windows/Linux中寫入文件權限

我正在寫一個C++項目,我應該打印一些數據到一個result.txt文件,但我需要知道我是否有權限。

Linux和Windows之間的檢查不同嗎?因爲我的項目應該在Linux上運行,目前我正在Visual Studio中工作。

回答

8

檢查權限的可移植方式是嘗試打開文件並檢查是否成功。如果沒有,errno(從頭部<cerrno>被設置爲值EACCES [是,一個S],那麼你就沒有足夠的權限,這應該在兩個Unix/LinuxWindows工作示例標準輸入輸出:

FILE *fp = fopen("results.txt", "w"); 
if (fp == NULL) { 
    if (errno == EACCES) 
     cerr << "Permission denied" << endl; 
    else 
     cerr << "Something went wrong: " << strerror(errno) << endl; 
} 

IOSTREAMS會略微有點不同。據我所知,他們不保證設置在兩個平臺上errno,或不僅僅是「失敗」的報告更具體的錯誤。

正如傑裏棺材寫道:不依靠單獨的訪問測試功能,因爲你的程序容易出現比賽條件和安全漏洞。

+0

謝謝,但我仍然沒有站在如何我可以知道我是否有權寫入文件到磁盤。 – Aviadjo 2010-09-26 18:30:39

+0

如果我嘗試並沒有權限,我認爲該程序將崩潰,我想通過檢查之前阻止它。有沒有檢查磁盤寫入權限的命令(寫入新文件)? – Aviadjo 2010-09-26 18:32:18

+2

爲什麼你的程序崩潰? :S – 2010-09-26 18:57:12

5

關於唯一合理的做法是嘗試創建該文件,如果失敗,則告訴用戶存在問題。任何提前測試的嘗試,只嘗試創建文件,如果您能夠創建並寫入文件,則可能會遇到來自競爭條件的問題(在您檢查時有權限,但在您嘗試時刪除了它使用它,反之亦然)和角落案例(例如,您有權限在該目錄中創建文件,但試圖在那裏寫入將超出您的磁盤配額)。要知道的唯一方法是嘗試...

3

實際測試文件寫入權限的最正確方法是嘗試寫入文件。原因是因爲不同的平臺以不同的方式顯示寫入權限。更糟糕的是,僅僅因爲操作系統告訴你可以(或不能)寫入文件,它可能實際上在撒謊,例如,在unix系統上,文件模式可能允許寫入,但文件處於只讀狀態媒體,或者相反,該文件實際上可能是內核爲進程自己使用而創建的字符設備,因此即使其文件模式設置爲全零,內核也允許該進程(並且只有該進程)使用它所有它喜歡的。