2012-12-11 112 views
7

私はEclipseプラグインjfaceアプリケーションを持っています。 スレッドがBufferedWriter経由でファイルを書き込みます。 書き込みが完了したら、ファイルの名前を変更しようとした後でバッファを閉じます。File.renameTo()は失敗します

ただし、ファイルの名前が変更されないことがあります。

私はいくつかのThread.Sleep(BIG_NUMBER)をいくつかのリトライの間に追加しようとしましたが、これは役に立ちませんでした。

ファイルがロックを取得しているようです。 (私はjvmを殺すとファイルの名前を変更できます)。

私にできることはありますか?

OS:Windows XPでは、Windows 7 JAVAのバージョン:1.5

+0

あなたはどのオペレーティングシステムを実行していますか? – NPE

+0

あなたが使っているコードを投稿できますか? –

答えて

13

File.RenameTo()は、プラットフォームに依存し、正常にファイル名を変更するために満たすべきいくつかの条件に依存して、より良い代替手段が使用しています

Path source = currentFile.toPath(); 
try { 
    Files.move(source, source.resolveSibling(formattedName)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

続きを読むhere。 javadocから

:名前の変更操作を別のファイルシステムから ファイルを移動することはできないかもしれません、それがない場合があります。このメソッドの動作の

多くの側面は、本質的に プラットフォームに依存していますアトミックであり、宛先抽象パス名が のファイルがすでに存在する場合は、 が成功しない可能性があります。 にリネーム操作が成功したことを確認するには、戻り値を常にチェックする必要があります。

Filesクラスは、ファイルをプラットフォームに依存しない方法で移動または名前を変更するmoveメソッドを定義しています。

+5

これは使えません! Java 1.5 – yuris

+0

私のWindows 7では、特にREPLACE_EXISTINGオプションとATOMIC_MOVEオプション(オプション)を追加するときに魅力的な働きをしました。ありがとうございました。 –

0

File.renameTo()を動作させるには、ファイルを外部アプリケーションから何らかの形で書き込み可能にする必要があります。

0

また、以下のような何かを行うことができます:

File o=new File("oldFile.txt"); 
File n=new File("newFile.txt"); 
n.delete(); 
o.renameTo(n); 

n.delete()を:私たちは、存在する場合は、ファイル(new.txt)を削除する必要があります。

o.rename(n):ファイル(old.txt)new.txt

How to find out why renameTo() failed?

Reliable File.renameTo() alternative on Windows?

http://www.bigsoft.co.uk/blog/index.php/2010/02/02/file-renameto-always-fails-on-windows

+0

私は最初に削除を使用しようとしますが、削除が失敗した場合はどうなりますか(何らかの理由でファイルがロックされていれば削除できません)? – yuris

0

と改名されるように、私たちは、UACを使用してWindows 7の下で問題があったし、予期しないファイルのアクセス許可。 File#canWriteは、ファイルI/Oを実行しようとする試みが失敗してもtrueを返します。

  1. あなたが実際に名前を変更しようとしているファイルが
  2. は、あなたがにファイルを書き込む(またはファイルの名前を変更)しようとしている場所がアクセス可能であることを確認してください存在することを確認してください。単純なテキストファイルを場所に書き出し、それが存在するかどうか、コンテンツが正しいかどうか(私たちは妄想的です)を確認してから、さらにI/Oを試みます。
+0

両方の条件が満たされている。 – yuris

+0

btw、canwriteがtrueを返す – yuris

+0

*ファイルI/Oを実行しようとする試みが失敗しても、ファイル "* canWrite"は "true"を返す* - ファイル7の書き込みが検出できなかったWindows 7の状況をexpereinced UACの制限により、返されたメソッドを 'true'でファイルします。指定された場所でファイルI/Oを実行しようとすると失敗します(通常サイレントモード) – MadProgrammer

0

これは問題なく機能しています。名前の変更は、2つのステップを使用して行われているが、とmanifest.xmlに権限を設定することを忘れないでください:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> 

public boolean RenameFile(String from, String to) { 
    to.replace(" ", ""); // clear all spaces within file name 
    File oldfile = new File(from); 
    File newfile = new File(to); 
    File tempfile = new File(to + ".tmp"); // add extension .tmp 
    oldfile.renameTo(tempfile); 
    return (tempfile.renameTo(newfile)); 
} 
関連する問題