2012-03-19 84 views
0

我需要重命名一個文件(保存在同一個目錄中); 我似乎無法找到一種方法,看看我的程序具有所需的權限:java:檢查一個文件是否可以在windows下移動

Files.isWritable(directory) && Files.isWritable(oldFile); 

總是返回true,羯羊或不運行的用戶有寫的文件,我想他們只是要檢查的權限(如果該文件是隻讀的,即使這違反了javadoc中所述的合同); 我不是一個安全管理器下運行,所以我不能叫

System.getSecurityManager.checkDelete(oldFile.toString()); 

我需要檢查的幾個文件重命名將(可能)成功,所以我不能只是嘗試和捕獲異常。
有沒有出路?顯然,一個便攜式解決方案將是可愛的,但我會解決一個特定於Windows的一個...

+0

檢查此問題http://stackoverflow.com/questions/736859/how-to-determine-if-a-file-will-be-logically-moved-or-physically-moved – 2012-03-19 14:11:18

+0

這可能會幫助你。 [http://stackoverflow.com/questions/736859/how-to-determine-if-a-file-will-be-logically-moved-or-physically-moved] – Java 2012-03-19 14:12:16

+0

那麼,對於「可能」,我認爲' canWrite()' - 和'exists()' - 和'isDirectory()' - (以及類似的)方法就足夠了。如果你想重命名,我會推薦一個try-catch-block,因爲對於IO我總是使用try-catch-block(有很多事情可能會出錯)......用你的確切代碼,它會盡管如此,更容易給出更準確的答案。 – AlexS 2012-03-19 14:13:41

回答

0

嘗試new SecurityManager().checkDelete(oldFile.toString())

1

那麼,你不能以這種方式檢查Windows ACL。 「原生」解決方案相當簡單,因爲Windows支持文件系統上的事務。只需撥打DeleteFileTransacted,並在任何一次刪除失敗時回滾事務。

如果你不使用tranactions,那麼第二種選擇是首先打開DELETE所需的訪問權限(DELETE是標準的WinNT訪問權限之一),拒絕任何共享。當且僅當所有文件都成功時,全部刪除它們全部用SetFileInformationByHandle(handle, FileDispositionInfo, &fdiObj, sizeof(fdiObj));

(後者不是交易並且可能因此存在隔離問題,進而影響原子性)。

+0

原來,你可以用java7: http://stackoverflow.com/questions/2815523/reading-windows-acls-from-java 無論如何,這個答案讓我在正確的方向。 – lultimouomo 2012-03-23 08:36:46

0

只是試着移動它!如果移動失敗,您沒有權限,或其他問題出錯。

這是一般原則。不要試圖預測未來,猜測即將進行的操作是否會成功。嘗試操作。否則,您會引入各種額外問題:

  1. 您可能會做出錯誤的測試。
  2. 條件可能會在測試和操作之間改變。
  3. 該操作通常會返回錯誤或拋出異常,您必須編寫代碼來處理:爲什麼要將它全部寫入兩次?
+0

因爲當我在問題 中寫道「我需要檢查幾個文件的重命名是否會(可能)成功,所以我不能只嘗試捕捉異常。」 我需要某種事務完整性,分佈在文件系統操作和數據庫更新。 它不需要(也很可能)具有真正的ACID保證,但是當事情必然會出錯時(即因爲您沒有對文件系統的寫入權限),系統會按順序進行預警。 – lultimouomo 2012-03-23 08:19:29

相關問題