8

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

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

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

ファイルが何らかのロックを取得しているようです。(jvm を強制終了すると、ファイルの名前を変更できます)。

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

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

4

5 に答える 5

15

File.RenameTo() はプラットフォームに依存し、ファイルの名前を正常に変更するにはいくつかの条件を満たす必要があります。

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

詳細はこちらをご覧ください

javadoc から:

このメソッドの動作の多くの側面は、本質的にプラットフォームに依存します。名前変更操作は、あるファイルシステムから別のファイルシステムにファイルを移動できない可能性があり、アトミックではない可能性があり、宛先の抽象パス名を持つファイルの場合は成功しない可能性があります。もう存在している。名前変更操作が成功したことを確認するために、戻り値を常にチェックする必要があります。

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

于 2012-12-11T18:17:25.783 に答える
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に変更されるようにします

renameTo()が失敗した理由を見つける方法は?

Windowsでの信頼できるFile.renameTo()の代替?

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

于 2012-12-11T18:48:03.213 に答える
0

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

于 2012-12-11T18:17:50.720 に答える
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));
}
于 2017-01-09T23:14:25.723 に答える
0

Windows 7 で UAC と予期しないファイル アクセス許可の問題が発生しました。 File#canWriteファイル I/O を実行しようとして失敗しても true を返します。

  1. 名前を変更しようとしているファイルが実際に存在することを確認してください
  2. ファイルを書き込もうとしている (またはファイルの名前を変更しようとしている) 場所にアクセスできることを確認してください。単純なテキスト ファイルをその場所に書き込み、それが存在するかどうか、およびその内容が正しいことを確認してから (妄想的です)、さらに I/O を試行します。
于 2012-12-11T19:35:40.933 に答える