File.mkdirがfalseを返すのはなぜですか?
Googleは、いくつかの理由(セキュリティ、許可、パス名など)が存在する可能性があることを示しています。
私の質問:
セキュリティ/許可が理由である場合、SecurityExceptionがスローされないのはなぜですか(javadocに記載されています)。
SecurityException
は、OSレベルではなく、JVMレベルの権限を持たない場合にスローされます
Falseを返す正確な理由を見つける方法はありますか?
いいえ、わかりません。知る唯一の方法は、自分でディレクトリのパーミッションをチェックし、それらを呼び出す前に存在しないことを確認し、親ディレクトリが存在するかどうかをチェックすることなどです。
ただし、Java 7以降を使用している場合は、代わりにNIOを使用してディレクトリを作成できます。具体的には、 Files.createDirectory
:
File dir = new File("mydir");
Files.createDirectory(dir.toPath());
Java.io.File
を使用せずにNIOを完全に使用する場合、代わりに Paths.get
を使用してPath
を作成できます。
Path dir = Paths.get("mydir");
Files.createDirectory(dir);
どちらの場合も、ディレクトリを作成できない場合は、操作が失敗した正確な理由とともにIOException
をスローします。
これはFiles
のほとんどのメソッドに当てはまるため、File
クラスのメソッドを使用するよりも使用することをお勧めします。
ディレクトリが既に存在する場合、mkdirおよびmkdirsはfalseを返すため、失敗の原因の1つである可能性があります。
Java 7を使用している場合、Filesクラスを使用できます。エラー時にIOExceptionをスローします。かなり良い説明があります。
Files.createDirectory(file.toPath());
いいえ、OSに依存する可能性があるため、少なくともJava内からではなく、mkdirs()
がfalseを返す正確な理由を見つける方法はありません。
SecurityException
のcheckRead()
およびcheckWrite()
メソッドにセキュリティ違反がある場合、SecurityManager
がスローされます。 OSアクセス許可の問題がある場合、例外はスローされません。
さらに、File.mkdir()
を呼び出し、親ディレクトリが存在しない場合、mkdir()
はfalseを返すことに注意してください。ただし、File.mkdirs()
を呼び出すと、存在しない親ディレクトリが作成されます。
Windowsに固有のものを次に示します。私の場合、ネストされたディレクトリ構造を直接作成しようとしていたため、file.mkdir()
メソッドはNoSuchFileException
で失敗しました(たとえば、最初に作成せずに_results\results_ddMMyyyy
_ results
ディレクトリ)Windowsの場合。
ただし、Macではまったく同じコードが正常に機能しました。つまり、Macではそのような例外はスローされず、file.mkdir()
メソッドによって中間のresults
ディレクトリが暗黙的に作成されました。
これが将来誰かを助けることを願っています。