5

これが私が始めたコードです:

long modifiedTime = [some time here];
File oldFile = new File("old_name.txt");
boolean renamed = oldFile.renameTo(new File("new_name.txt");
boolean timeChanged = oldFile.setLastModified(modifiedTime);

System.out.println("renamed: " + renamed);
System.out.println("time changed: " + timeChanged);

そして、私が見た出力は次のとおりです。

renamed: true
time changed: false

しかし、私が試したとき:

long modifiedTime = [some time here];
boolean renamed = new File("old_name.txt").renameTo(new File("new_name.txt"));
boolean timeChanged = new File("new_name.txt").setLastModified(modifiedTime);

System.out.println("renamed: " + renamed);
System.out.println("time changed: " + timeChanged);

この出力で、うまくいくように見えました:

renamed: true
time changed: true

2 番目のアプローチが機能し、最初のアプローチが機能しないのはなぜですか?

4

3 に答える 3

4

最初のケースでは、もはや存在しないファイルの最後に変更された属性を変更しようとしています! 名前を変更したばかりだからです。2 番目のケースでは、既存の有効なファイルの属性を変更しています。

これは、Java クラス File がネイティブ コマンドのシン ラッパーであるためです。instance を作成し、インスタンスold = new File("oldname")renameメソッドを呼び出してold呼び出すと、実際にシステム コールが実行され、ファイル名とコマンドの両方が送信されます。ただし、この時点ではファイル名は関係ありません。

今、それがはっきりしていることを願っています。

于 2011-07-24T08:36:48.587 に答える
2

oldFile.renameTo(new File("new_name.txt"));oldFileポイントの場所は変わりません。oldFileのパスはまだold_name.txtその呼び出しの後です。

したがって、その時点ではもう存在しないsetLastModifiedため、呼び出しは失敗します。old_name.txt

于 2011-07-24T08:36:48.357 に答える
1

File、存在する場合も存在しない場合もあるファイルまたはディレクトリへのパスを表します。

ファイルの名前を変更すると、元の名前のファイルはなくなります。

于 2011-07-24T08:36:36.043 に答える