1

私はこれがおそらくここで何百万回も答えられたことを知っていますが、私が見たすべては私を助けませんでした。これが私のコードです:

for(File g: f.listFiles()){
    for(File h : g.listFiles()){
        try{
            Scanner s = new Scanner(h);
            String timestamp = s.next().split("[?]")[4];
            File z = new File(h.getAbsolutePath().split("[.]")[0] + timestamp + h.getAbsolutePath().split("[.]")[1]);
            boolean q = h.renameTo(z);
        }catch(Exception e){

        }
    }
}

File zが存在するかどうかを確認しましたが、存在しません。ファイルhが存在するかどうかを確認しましたが、存在します。hが絶対パスであることを再確認しました。zの絶対パスを出力すると、正しいパスが得られます。fのディレクトリまたはgのファイルはどれも開いていません。hで示されたファイルは開いていません。Windowsがプログラムの名前変更を許可していないファイルにフラグが設定されている可能性がありますか?

4

3 に答える 3

3

私の推測では、あなたは私がここで抱えていたのと同様の問題を抱えていると思いますファイルの削除/移動が失敗します

スキャナーにFileinputStreamsを使用してみてください

FileInputStream fin = new FileInputStream(h);
fin.open()
Scanner s = new Scanner(fin);
//do work
fin.close()

名前を変更する前にストリームを閉じます

于 2012-07-19T22:41:43.830 に答える
2

renameToの動作は、プラットフォームごとに異なります。あるプラットフォームで成功した操作は、別のプラットフォームでは失敗する可能性があります。たとえば、私のローカル開発ワークステーション(OS X)では、すべてが期待どおりに機能しました。本番システム(Solaris)で、renameToが一貫して失敗しました。私は最終的に、ファイルが別のパーティションにある場合に失敗したと判断しました。明らかに、ここではそうではありませんが、メソッドが予期しない方法で動作する可能性があることを示しています。

一貫した動作を得るには、データを新しいファイルにコピーしてから、元のファイルを削除します。

于 2012-07-19T22:52:11.203 に答える
1

私はほとんど同じ問題を抱えていました。名前変更のケースのいくつかは成功し、いくつかは失敗しました。これらの失敗したケースでは、ソースファイルパスと宛先ファイルパスが同じファイルシステムにないことがわかりました。私の場合、NTFSは、宛先ファイルの移動先となる別のファイルシステムをマウントしました。名前変更関数の本来の目的は、関連するファイルのデータを移動するのではなく、単に名前の名前を変更することです。ソースファイルパスと宛先ファイルパスの両方が異なるファイルシステムにある場合、特定のプラットフォームで一部のバージョンのJVMが失敗します。実際、これはjava.ioのバグであり、Solarisは新しいバージョンでこのバグを修正しています。幸運を!

HappyForever、

于 2013-06-07T20:34:37.497 に答える