実現したいこと
Aと言うフォルダに中身が0バイトの「a.txt」を置き、JavaのソースコードにBと言うフォルダに「a.txt」をコピーして、コピーした「a.txt」の更新日時を更新する内容で改修したいです。
発生している問題・分からないこと
Aと言うフォルダに中身が0バイトの「a.txt」をBと言うフォルダに「a.txt」をコピーする事ができました。しかし、Bと言うフォルダにある「a.txt」の更新日時が更新されず、苦戦をしています。
エラーメッセージ
error
1エラーメッセージは表示されずコンパイルが通って、Bと言うフォルダに「a.txt」をコピーする事ができました。しかし、Bと言うフォルダにある「a.txt」の更新日時が更新されないです。
該当のソースコード
Java
1import java.nio.file.Path; 2import java.nio.file.Paths; 3import java.nio.file.Files; 4import java.io.IOException; 5import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; 6import java.io.File; 7import java.util.Calendar; 8 9public class JSample{ 10 public static void main(String[] args){ 11 Path p1 = Paths.get("C:/code/A/a.txt"); 12 Path p2 = Paths.get("C:/code/B/ a.txt "); 13 14 try{ 15 //コピー先のファイルが既に存在していた場合に例外を発生させるのではなくコピー元のファイルをコピーした新しいファイルで置き換え 16 Files.copy(p1, p2, REPLACE_EXISTING); 17 }catch(IOException e){ 18 System.out.println(e); 19 } 20 } 21 public void lastModified() throws IOException{ 22 File file = new File("C:/code/B/ a.txt "); 23 //Calendarクラスのオブジェクトを生成する 24 Calendar cal = Calendar.getInstance(); 25 //初期化する 26 cal.clear(); 27 28 //日時を設定する 29 cal.getTime(); 30 //ファイルに日時セットする 31 file.setLastModified(cal.getTimeInMillis()); 32 } 33} 34
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Bと言うフォルダに「a.txt」をコピーする事ができました
補足
■参考URL
①ファイルやディレクトリをコピーする
https://www.javadrive.jp/start/file/index11.html
②更新日時を取得する
https://qiita.com/fumikomatsu/items/b98cc4d0dee782323096
どうやって『「a.txt」の更新日時が更新されず』という現象を確認しましたか? 更新日時がどうなるべきで、実際はどうなっていたのでしょうか。
mainメソッド内でlastModifiedメソッドを呼び出していないようです。mainメソッド内でlastModifiedを呼び出していて、かつ、最終更新日時が更新されていないソースコードを提示できますか?
int32_tさん
説明不足で申し訳ございません
Bと言うフォルダに「a.txt」があって、フォルダのウィンドウでそのテキストファイルの更新日時を見るとAと言うフォルダにある「a.txt」と言う同じ現象であると言う事です。
更新日時はプログラムを動かしたシステム日時であるべきです。例えば、Aと言うフォルダにある「a.txt」を作成した時間が昨日の7/12の10時だとして、プログラムを動かすとBと言うフォルダに同じテキストファイルがコピーされて更新日時が本日の7/13の11:06。翌日に動かすと7/14の11:06と言うように更新日時が更新されると言うプログラムです。
neko_the_shadowさん
確かにメインメソッド内にlastModifiedメソッドを呼び出していないですね・・・
その辺りを少し検討して修正を試みます
>更新日時はプログラムを動かしたシステム日時であるべきです。
エクスプローラーでファイルのコピーをしてみるとわかりますが、それは更新日時ではなく、作成日時のほうです。
IT業界にいてシステムの運用保守をメインに仕事をしているのですが、時々システムの改修をする事があり、久々に当たりました。いきなりは厳しいのでまずは簡易的なものと言う事でソースコードを記載しました。
neko_the_shadowさん
Javaの基本であるメインメソッドに他のメソッドの処理を入れるのを忘れてしまいました。申し訳ございません。
19・20行目の間に「lastModified();」を入れてコマンドプロンプトで実行した所、「staticでないメソッドlastModified()をstaticコンテキストから参照する事はできません」とエラーが発生しました
hiroki-oさん
更新日時がAと言うフォルダにある、「a.txt」と同じと言う事ですね・・・
コピー先のファイルの日時を更新するコマンドがもしご存知でしたら、ご教授いただければ幸いです・・・
やりたいことは、
Aと言うフォルダある「a.txt」を別のBと言うフォルダに「a.txt」と同じファイル名でコピーして、コピー先のBにある「a.txt」の更新日時をコピーを実施した日時にしたいです。
ということでいいのでしょうか?
Java縛りは必須ですか?バッチファイルでやれば簡単明快ですけど。
あとは、作成日時をどうするかですね。
コピー先にすでに同名の a.txt が存在する場合に、一旦消して再作成するか(作成日時もコピーを実施した日時になる)、上書きするか(作成日時は上書き前と変わらず)かについて、希望があるのか、どうでも良いのか。
otnさん
下記の件、
>Aと言うフォルダある「a.txt」を別のBと言うフォルダに「a.txt」と同じファイル名でコピーして、コピー先のBにある「a.txt」の更新日時をコピーを実施した日時にしたいです。
おっしゃる通りです
システムではタスクスケジューラで設定して動かしています。毎週1回ある曜日の時間になると、タスクスケジューラが設定しているバッチファイルを起動して、バッチファイルの中にあるJavaやSQL文のファイルを読んで処理される仕組みになっています。
コピー先のBにある「a.txt」の更新日時をコピーを実施した日時にするのにJavaで実現厳しそうなら、バッチファイルにします。
希望はBにある「a.txt」は出力時に更新日時が更新されれば、良いです。そうなると、コピー先に既に同名の「a.txt」が存在する場合に一旦消して再作成するか(作成日時もコピーを実施した日時になる)の方になると言う事でしょうか。
質問記載の下記行、無駄な空白入ってませんか?
Path p2 = Paths.get("C:/code/B/ a.txt ");
あとJDKのバージョン、OSは書いた方がいいです(Windowsだと思うけど、ファイルシステム依存もあると思うので)。最近のJavaはLTSとかあって、現在は多分JDK21がLTSです(次が25らしい)。LTSでないもののサポートは半年しかありません。
一応なぜLastModifiedが変更されないか?ですが、それはNTFSの仕様だからです。現在確認できるMS謹製の資料が見当たらなかったのですが、以前出していたKnowledgeBaseのアーカイブでは以下のようになっています。
https://mskb.pkisolutions.com/kb/299648
Calendarクラスを使用する方法はhiroki-oさんが書いているようにすればいいのですが(多分元の実装意図を組んでそうしてるのだと思う)、このケースではLocaleなどに依存しないjava.util.Dateクラスを使う方が簡便です。
p.toFile().setLastModified(new Date().getTime());
回答2件
あなたの回答
tips
プレビュー