2012-05-28 13 views
5

我有下面的代碼片段:如何檢查文件的權限在爪哇(OS獨立)

public class ExampleClass { 

public static void main(String[] args) throws FileNotFoundException { 
    String filePath = args[0]; 
    File file = new File(filePath); 

    if (!file.exists()) 
     throw new FileNotFoundException(); 

    if (file.canWrite()) 
     System.out.println(file.getAbsolutePath() + ": CAN WRITE!!!"); 
    else 
     System.out.println(file.getAbsolutePath() + ": CANNOT WRITE!!!!!"); 

    if (file.canRead()) 
     System.out.println(file.getAbsolutePath() + ": CAN READ!!!"); 
    else 
     System.out.println(file.getAbsolutePath() + ": CANNOT READ!!!!!"); 

    if (file.canExecute()) 
     System.out.println(file.getAbsolutePath() + ": CAN EXECUTE!!!"); 
    else 
     System.out.println(file.getAbsolutePath() + ": CANNOT EXECUTE!!!!!"); 
} 
} 

它工作在Linux操作系統,但問題是,它並沒有在Windows7工作。所以問題是:有沒有人知道一種方法來獨立檢查Java OS中的文件權限?

+6

它是如何在Windows 7上「不行」? –

+1

什麼*精確*不起作用? –

+0

告訴您在運行上述代碼時獲得哪些文件權限的輸出。不能做任何事情都不行。 – MozenRath

回答

5

這可能是由某些東西(例如反病毒產品)以不一致的方式「調解」文件訪問引起的。

當然,很難相信Java的File.canXxxx()方法是一般破壞任何味道的Windows。


UPDATE - 我收回這句話。閱讀this Sun bug report ...和哭泣。簡而言之,這是一個Windows錯誤,Sun決定不去解決它。 (但是新的Java 7 API 工作...)

FWIW,我認爲嘗試檢查這樣的文件訪問權限是不正確的做法。最好簡單地嘗試使用該文件,並在發生異常時捕捉異常。我的推理見https://stackoverflow.com/a/6093037/139985。 (現在我們有另一個原因...)

+0

返回true,但他們是,File.canExecute()返回true,在執行文件(.bat)在cmd中返回「拒絕訪問」 –

+0

好的,謝謝你,這是有益的 –

+0

我已經測試在鏈接的代碼,我發現,在JDK 1.7.0_79這個bug是沒有更多的。當我設置的文件不能寫,並隱藏在Windows資源管理器10,該代碼顯示它不能被寫入並且是隱藏的,符合市場預期。所以我認爲它已經在Java 7中修復了。 – FaithReaper

0

我已經對NIO API(來自Java 7)進行了一些測試,它們看起來很完美。

import java.io.FileNotFoundException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public class PermissionCheck { 

    public static void main(String[] args) throws FileNotFoundException { 

     String filePath = args[0]; 
     Path p = Paths.get(filePath); 

     if (Files.notExists(p)) 
      throw new FileNotFoundException(); 

     if (Files.isWritable(p)) 
      ... 

     if (Files.isReadable(p)) 
      ... 

     if (Files.isExecutable(p)) 
      ... 
    } 
} 

的JDK:1.7.0_25,1.8.0_91

操作系統:Windows 7,8(64位)

2

首先,Java的信任本地文件和不可信的遠程文件默認情況下和設計。因此,在測試時,請注意,您可以在家中的計算機上執行哪些操作,但在公司服務器的某些遠程驅動器中可能無法實現。

其次,當我們檢查遠程驅動器文件的權限,它通常沒有足夠的只是設置它在Windows資源管理器(屬性... - 只讀/隱藏/存檔等) 。例如,我的組織有其他mechinisms來控制本地和遠程文件權限,甚至是我的電腦的管理員不能保證一切。即使手動/編程方式您可以更改文件的權限,如果其他應用程序/組策略/等禁止您這樣做,更改可能會失敗。 (例如,setReadable()回報false,表明這是不可能的)。例如,我可以execute一個txt文件的遠程目錄,這意味着打開它,但bat文件在同一目錄下是不可執行的,實際上,在我的情況,當我想創建一個bat文件時,我需要讓我的管理員獲得更多權限。我認爲這可能是bat擴展名被禁止。因爲作爲Windows中的某個用戶組中的用戶,由您運行的操作和JVM受JVM本身的更高規則限制。糾正我,如果我錯了。

但是,即使您可能無法設置文件的權限,現在您可以在Java 7中正確讀取它們。很明顯,在錯誤報告之後,Java人員已經做了一些工作來解決大部分問題。我使用jdk 1.7.0_19,並進行測試,我也做了以下內容:

  1. 將遠程文件的屬性,在Windows資源管理器,以Read OnlyHidden

  2. 從Java閱讀,下面的代碼(從Stephen C的鏈接和修改,看看setXxxxx()方法可以工作)。

    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.IOException; 
    
    public class FilePermissionTester { 
        public static void main(String[] args) throws IOException { 
         File file = new File("Y:\\some\\remote\\drive\\directoy\\xxxxx.txt"); 
         System.out.println("exists:" + file.exists()); 
         System.out.println("is file:" + file.isFile()); 
         System.out.println("can read:" + file.canRead()); 
         System.out.println("can execute:" + file.canExecute()); 
         System.out.println("can write:" + file.canWrite()); 
         System.out.println("is hidden:" + file.isHidden()); 
    
         System.out.println("change it to be unreadable, and it works? " + file.setReadable(false)); 
         System.out.println("can read:" + file.canRead()); 
         System.out.println("change it to be writable, and it works? " + file.setWritable(true)); 
         System.out.println("can write:" + file.canWrite()); 
         FileInputStream fileInputStream = new FileInputStream(file); 
         fileInputStream.read(); 
         fileInputStream.close(); 
    
    
        } 
    
    } 
    

我:

exists:true 
is file:true 
can read:true 
can execute:true 
can write:false 
is hidden:true 
change it to be unreadable, and it works? false 
can read:true 
change it to be writable, and it works? true 
can write:true 

現在我可以讀取該文件,對其進行編輯並保存。在更改權限之前,我被要求保存爲另存爲..

請注意,該文件是可讀的,setReadable(false)返回false,並且該文件仍然是可讀的。 JavaDoc表示heresetReadable()返回false當用戶沒有權限更改訪問權限時,或者readable已經是false,並且底層系統沒有爲此執行。調試到Java API不提供太多信息,因爲實現標記爲native,並且看不到更多信息。但我有權改變可寫性,所以這是我不明白的。

還要注意的是有更多的屬性,在那裏,不被java.util.File支持,像 。也許你可以檢查java.security其他pacakges,如AccessController