首先,Java的信任本地文件和不可信的遠程文件默認情況下和設計。因此,在測試時,請注意,您可以在家中的計算機上執行哪些操作,但在公司服務器的某些遠程驅動器中可能無法實現。
其次,當我們檢查遠程驅動器文件的權限,它通常沒有足夠的只是設置它在Windows資源管理器(屬性... - 只讀/隱藏/存檔等) 。例如,我的組織有其他mechinisms來控制本地和遠程文件權限,甚至是我的電腦的管理員不能保證一切。即使手動/編程方式您可以更改文件的權限,如果其他應用程序/組策略/等禁止您這樣做,更改可能會失敗。 (例如,setReadable()
回報false
,表明這是不可能的)。例如,我可以execute
一個txt
文件的遠程目錄,這意味着打開它,但bat
文件在同一目錄下是不可執行的,實際上,在我的情況,當我想創建一個bat
文件時,我需要讓我的管理員獲得更多權限。我認爲這可能是bat
擴展名被禁止。因爲作爲Windows中的某個用戶組中的用戶,由您運行的操作和JVM受JVM本身的更高規則限制。糾正我,如果我錯了。
但是,即使您可能無法設置文件的權限,現在您可以在Java 7中正確讀取它們。很明顯,在錯誤報告之後,Java人員已經做了一些工作來解決大部分問題。我使用jdk 1.7.0_19
,並進行測試,我也做了以下內容:
將遠程文件的屬性,在Windows資源管理器,以Read Only
和Hidden
。
從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?
它是如何在Windows 7上「不行」? –
什麼*精確*不起作用? –
告訴您在運行上述代碼時獲得哪些文件權限的輸出。不能做任何事情都不行。 – MozenRath