簡體   English   中英

如何在Java中檢查文件權限(OS獨立)

[英]How to check file permissions in Java (OS independently)

我有以下代碼片段:

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中獨立檢查文件權限的方法?

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

當然,很難相信Java File.canXxxx()方法通常會在任何類型的Windows上被破壞。


更新 - 我把它拿回來。 閱讀這篇Sun bug報告 ......然后哭泣。 簡短的回答是它是一個Windows錯誤,Sun決定不解決它。 (但新的Java 7 API 確實有用......)

FWIW,我認為嘗試檢查這樣的文件訪問權限是不好的做法。 最好只是嘗試使用該文件,並在發生時捕獲異常。 有關我的推理,請參閱https://stackoverflow.com/a/6093037/139985 (現在我們有另一個原因......)

我已經對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位)

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

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

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

  1. 在Windows資源管理器中將遠程文件的屬性設置為“ Read Only和“ Hidden

  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的說這里setReadable()返回false時用戶沒有權限更改訪問premission,或當readable已經是false ,和底層系統沒有實現這一點。 調試到Java API並不提供太多信息,因為實現標記native ,無法看到更多信息。 但我有權改變可寫性,所以這是我不明白的。

但是請注意, java.util.File不支持更多屬性,例如 setHidden() 也許你可以檢查java.security其他pacakges,比如AccessController

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM