2009-08-13 5 views
26

小さなユーティリティアプリケーションは、GUIファイルセレクタを介して出力ディレクトリをユーザに尋ねます。 それは何らかの処理の後でこの出力ディレクトリにたくさんのファイルを作成します。ファイル内にファイルを作成する前にディレクトリへの書き込みアクセスを確認する

私はアプリケーションがユーザに通知し、 が

私の最初の試みは、canWrite(だった(長い時間がかかる可能性がある)処理を続行しないように書き込みアクセス権を持っているかどうかを確認する必要があり

メソッドjava.io.File。しかし、これは で動作しません。なぜなら、ディレクトリエントリ自体を扱い、その内容は扱っていないからです。私は少なくとも 名前を変更または削除することができますが、(許可のために) ファイルが作成されないWindows XPフォルダの1つのインスタンスを見てきました。これは実際に私のテストケースです。

私は最終的にそれだけで操作が成功した場合、実際のファイルとチェックを作成しようとするので、しかし、これは私にエレガントな感じがしない以下のソリューション

//User places the input file in a directory and selects it from the GUI 
//All output files will be created in the directory that contains the input file 
File fileBrowse = chooser.getSelectedFile(); //chooser is a JFileChooser 
File sample = new File(fileBrowse.getParent(),"empty.txt"); 
try 
{ 
    /* 
     * Create and delete a dummy file in order to check file permissions. Maybe 
     * there is a safer way for this check. 
     */ 
     sample.createNewFile(); 
     sample.delete(); 
} 
catch(IOException e) 
{ 
     //Error message shown to user. Operation is aborted 
} 

と和解。

私はこれまでに見つかったすべての解決方法が必要だと思っています。 セキュリティマネージャとスタンドアロンアプリケーションではなく、Javaアプレットを取り扱っています。 何か不足していますか?

は、実際にファイルを書き込む前に、ディレクトリ内のファイルアクセスをチェックする方法をお勧めは何ですか?

私はそれはあなたが最終パスcanWriteを起動しても動作しますないJava 5に

+0

"empty.txt"が既に存在する場合はどうなりますか?その後重要なファイルが削除されてしまいます。 –

+0

はい、ファイルが実際には作成されなかったかどうかを理解するためにcreateNewFile()によって返されたブール値が使用された場合に最適です。 – kazanaki

答えて

19

です見つけますあなたBUT(!)は、試してみるのに最適な方法ではありませんか?あなたがパーミッションをチェックし、ファイルシステムが変わったら...コードを変更する必要があります。しかし、ファイルを書き込もうとすると、ファイルを書き込めるかどうかが常に伝えられます。

あなたのソリューションは、最も洗練されたものである必要はありません。それは安価なハードコードされたパッチや何か醜いではありません。それはちょうど普通のコードです。そして、それは常に動作します。しかし、コード内のチェックを見るのが好きでない場合は、唯一の目的は、書き込みの可能性をチェックすることですクラスに入れてそれを分離します。実際、エレガンスが好きであるかどうかは、ユーティリティクラスに入れてください。

他のソリューションは、tryで、あなたの全体の執筆ツー・ハードドライブのコードを配置することです。あなたが書くことができない場合、全体の部分はスキップされ、あなたはcatch部にメッセージでユーザにフィードバックを与えます。

0

を使用していますか?

File sample = new File(fileBrowse.getParent(),"empty.txt"); 

if (sample.canWrite()) { 
    doSomethingUseful(sample); 
} else { 
    notifyUser(); 
} 
+4

ファイルが存在するかどうかをcanWriteがチェックするので、そうではありません。これはあなたのコードでは当てはまりません。これはjavadocに記述されています。 – kazanaki

0

詳細は、FilePermissionをご利用ください。 私はあなたがSecurityManagerコードを実装する必要がある1つの方法は、あなたは、ファイルのパーミッションをチェックしたディレクトリが存在することを確認し、チェックの多くを行うか、すべてのことがのチェックないライブラリを見つけることができるherehere

+0

FilePermissionを見ましたが、ファイルへのアクセスを許可するためにアプレットで使用されているようです。スタンドアロンアプリケーションの例がありますか? – kazanaki

0

は、私は、ファイルを書き込むことができないとき/場合は、優れたユーザー体験を提供することに集中を言うだろう、とだけパスを事前にチェックする気にしないでください。処理には談合が必要だと言われているので、処理が終わるとそのパスに書き込むことができるという保証はありません。あなたがチェックしたり書き込んだり、ディスクがいっぱいになる可能性があります。

0

Java 1.8を使用して、以下を使用できました。

Set<PosixFilePermission> permissions = Files.getPosixFilePermissions(Paths.get(destDir), LinkOption.NOFOLLOW_LINKS); 
Assert.assertTrue("User did not have read permission.", permissions.contains(PosixFilePermission.OWNER_READ)); 
Assert.assertTrue("User did not have execute permission.", permissions.contains(PosixFilePermission.OWNER_EXECUTE)); 
Assert.assertTrue("User did not have write permission.", permissions.contains(PosixFilePermission.OWNER_WRITE)); 

Assert.assertFalse("Group did have read permission.", permissions.contains(PosixFilePermission.GROUP_READ)); 
Assert.assertFalse("Group did have execute permission.", permissions.contains(PosixFilePermission.GROUP_EXECUTE)); 
Assert.assertFalse("Group did have write permission.", permissions.contains(PosixFilePermission.GROUP_WRITE)); 

Assert.assertFalse("Others did have read permission.", permissions.contains(PosixFilePermission.OTHERS_READ)); 
Assert.assertFalse("Others did have execute permission.", permissions.contains(PosixFilePermission.OTHERS_EXECUTE)); 
Assert.assertFalse("Others did have write permission.", permissions.contains(PosixFilePermission.OTHERS_WRITE)); 
関連する問題