2012-12-27 27 views
3

代碼:設置文件權限返回FALSE始終

File dir = new File(path); 
boolean rc1 = dir.setExecutable(true, false); 
boolean rc2 = dir.setReadable(true, false); 
boolean rc3 = dir.setWritable(true, false); 
if (!rc1 || !rc2 || !rc3){ 
    logger.warn("One of the permissions set returned false: rc1="+rc1+" rc2="+rc2+" rc3="+rc3 + " [for dir '"+dir+"']"); 
} 

在Ubuntu上所有3個調用返回false。 在我的Windows上,只有第三次調用setWritable纔會返回false。

目標是創建文件/目錄,以便用戶(tomcat)和組將能夠讀取/寫入。
但在Ubuntu上創建的文件沒有權限寫組。

+0

做你以root用戶身份運行程序? –

+1

您是否以擁有該目錄的用戶身份運行該程序?用戶是Windows下的管理員嗎? –

+0

@Akhil - 不,它在Tomcat中運行,因此創建爲'tomcat'用戶。 – urir

回答

10

我找到了解決辦法,並會回答我的問題:
在設置上的文件或目錄的權限,你首先必須真正建立目錄或寫入文件,只然後設置權限。
所以,我在開始做是錯誤的:

File dir = new File(path); 
boolean rc1 = dir.setExecutable(true, false); 

,而實際上需要:

File dir = new File(path); 
dir.mkdirs(); 
boolean rc1 = dir.setExecutable(true, false); 
boolean rc2 = dir.setReadable(true, false); 
boolean rc3 = dir.setWritable(true, false); 

File f = new File(uploadedFileLocation); 
    ImageIO.write(image, "jpg", f); 
    boolean rc1 = f.setExecutable(true, false); 
    boolean rc2 = f.setReadable(true, false); 
    boolean rc3 = f.setWritable(true, false); 

然後,它會工作:)

+1

我試過你的方式,但它不適用於Ubuntu。請指教 –

+1

這兩個解決方案都不適合我在Android上使用。 –

1

也許你沒有在Linux中以超級用戶的身份運行它。您可能(登錄爲)本身無權授予文件權限。

+0

正確,這不是超級用戶。這是運行Tomcat的'tomcat'用戶。用戶是其他Group X的一部分。在創建目錄和文件時,我們希望將組X中的其他用戶的權限授予此文件。 – urir

2

從的javadoc

setExecutable(): 返回

真當且僅當操作成功。 如果用戶無權更改此抽象路徑名稱的訪問權限,則操作將失敗。如果可執行文件爲false且底層文件系統未實現執行權限,則操作將失敗。

此外,

文件(字符串路徑名) 由給定路徑名字符串轉換成抽象路徑名來創建一個新的File實例。 它創建一個文件實例。它不會創建一個新的文件。

要創建一個新的文件

File f; 
    f=new File("myfile.txt"); 
    if(!f.exists()){ 
    f.createNewFile(); 
    System.out.println("New file \"myfile.txt\" has been created 
    to the current directory"); 
    } 
+0

如果我通過此用戶登錄,那麼在命令行中,我有權更改它。 – urir

+0

另外:創建目錄和在dir中創建文件的調用同樣正確。 – urir

+0

也嘗試更改ubuntu上的umask –