2012-04-01 10 views
5

次のコードは、必ずしもファイルを作成するわけではありません。 私が気づいている限り、このコードは初めて実行されましたが、例外はスローされず、createdFileSucceeded == trueでファイルは作成されません。Java file.createNewFileファイルが作成されず、例外がスローされない

私は、任意の入力が

File file = new File(tmpDir, fileName); 

try { 
if (tmpDir == null) { 
    String environmentHomePath // = somePath; 
    tmpDir = new File(environmentHomePath, "SampleDumps"); 

    if (! tmpDir.exists() || ! tmpDir.isDirectory()) { 
    boolean mkdirSucceeded = tmpDir.mkdir(); 
    if (! mkdirSucceeded) { 
     throw new IOException("Failed creating directory: '" + tmpDir.getAbsolutePath() + "'"); 
    } 
    } 
} 

if (file.exists()) { 
    boolean deleteFileSucceeded = file.delete(); 
    if (! deleteFileSucceeded) { 
    throw new IOException("Unable to delete pre existing sample file: '" + fileName + "'"); 
    } 
} 

boolean createFileSucceeded = file.createNewFile(); 
if (! createFileSucceeded) { 
    throw new IOException("Unable to create sample file: '" + fileName + "'"); 
} 

fw = new FileWriter(file); 
bw = new BufferedWriter(fw); 

StringBuilder sb = new StringBuilder("something..."); 

bw.write(sb.toString()); 
bw.flush(); 
} 
catch (IOException ioe) { 
log.warn("Unable to file invalid sample to file: '" + fileName + "'", ioe); 
} 
finally { 
if (bw != null) { 
    try { 
    bw.close(); 
    } catch (IOException e) { 
    log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
    } 
} 
else if (fw != null) { 
    try { 
    fw.close(); 
    } catch (IOException e) { 
    log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
    } 
} 
} 
+0

多分、アプリケーションを実行しているユーザが、そのディレクトリにあるファイルを作成するための十分な権限を持っていないのです。 –

+0

@LuiggiMendozaですが、同じプロセス内で連続してコードを実行します。 –

+1

私はあなたのコードを実行しようとしていないが、そのディレクトリに存在すると予想されるファイルを作成した後にtmpDirを作成すると、exist()のようなFileメソッドから予期しない動作が発生する可能性があります。 – GreyBeardedGeek

答えて

6

file.createNewFile()あればリターンはtrueそのファイルが作成された役に立つことができたJava 6

、Windows上でコードを実行します。

ファイルが作成されている可能性が最も高い説明ですが、期待している場所ではありません。私はあなたが


はあなたのコードとあなたのコメントでより慎重に探しています...ファイルの相対パス名を使用していることを期待して、私はそれが正確に何が起こっているかと思います。一時ディレクトリを作成する方法を見てみましょう。まず、 tmpdirを親ディレクトリとして使用してファイルを構築します。次に、 tmpdirnullであることをテストし、ディレクトリを作成します。しかし、の親ディレクトリがある Fileオブジェクトを使用するようにしてください。

tmpdirをチェックし、必要に応じて作成した後にFileオブジェクトを作成する必要があります。

2

tmpDirを扱うアプローチに欠陥があります。ファイルはのどこかに作成されていますFile(String, String)のJavadocから

:親が、新しいFileのインスタンスnullの場合

は、指定された子のパス名文字列で単一引数のFileコンストラクタを呼び出すことであるかのように作成されます。

2

いくつかのテストの後、私は間違いを発見し、それを修正しました:

try { 
    //create tmpDir if its null 
    if (tmpDir == null) { 
     String environmentHomePath = "D:/"; //change to somepath 
     //tmpDir must be a directory path 
     tmpDir = new File(environmentHomePath); 

     if (!tmpDir.exists() || !tmpDir.isDirectory()) { 
      boolean mkdirSucceeded = tmpDir.mkdir(); 
      if (!mkdirSucceeded) { 
       throw new IOException("Failed creating directory: '" + tmpDir.getAbsolutePath() + "'"); 
      } 
     } 
    } 
    //create the path 
    File file = new File(tmpDir, fileName); 
    if (file.exists()) { 
     boolean deleteFileSucceeded = file.delete(); 
     if (!deleteFileSucceeded) { 
      throw new IOException("Unable to delete pre existing sample file: '" + fileName + "'"); 
     } 
    } 
    boolean createFileSucceeded = file.createNewFile(); 
    if (!createFileSucceeded) { 
     throw new IOException("Unable to create sample file: '" + fileName + "'"); 
    } 

    fw = new FileWriter(file); 
    bw = new BufferedWriter(fw); 

    StringBuilder sb = new StringBuilder("something..."); 
    bw.write(sb.toString()); 
    bw.flush(); 
} catch (IOException ioe) { 
    log.warn("Unable to file invalid sample to file: '" + fileName + "'", ioe); 
} finally { 
    try { 
    if (bw != null) { 
     try { 
      bw.close(); 
     } catch (IOException e) { 
      log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
     } 
    } 
    else if (fw != null) { 
     try { 
      fw.close(); 
     } catch (IOException e) { 
      log.warn("Unable to close Writer to file: '" + fileName + "'", e); 
    } 
} 
+0

@BrianRoach私は答えがないときにテストをしました。問題を見つけるのは初めてだったので、私はStephenCを大げさにしました –

0

は、ファイル名を確認してください。コロン:または例外をスローする他の同様の文字を含むべきではありません。

関連する問題