Javaでファイルの作成日を決定する


102

StackOverflow(Javaでのファイルの作成日を取得する方法)に関する私の別の同様の質問がありますが、OPには他のメカニズムで解決できる別のニーズがあるため、答えは実際にはありません。年齢でソートできるディレクトリ内のファイルのリストを作成しようとしています。そのため、ファイル作成日が必要です。

私はウェブをかなりトロールした後、これを行う良い方法を見つけていません。ファイルの作成日を取得するメカニズムはありますか?

BTWは現在Windowsシステム上にありますが、Linuxシステム上でも同様に機能する必要があります。また、作成日時が名前に埋め込まれている場合のファイル命名規則に従うことは保証できません。


2
さて、ファイルシステムについてのさらなる議論と調査の結果、作成日とともにチェックする必要があったため、最終変更を使用することで十分であると判断しました。古いファイルが最近変更されたためにまだアクティブであるかどうかを判別するには、両方をチェックする必要があります。したがって、過去に最も変更されたファイルを確認してください。すべての入力をありがとう。ところで、私はnioを使用したいと思いますが、ここでのLinuxフレーバーはとにかくファイル作成をサポートしていません。
トッド

回答:


163

Java nioには、ファイルシステムが提供する限り、creationTimeおよびその他のメタデータにアクセスするオプションがあります。チェックこのリンクをアウト

例(@ydaetskcoRのコメントに基づいて提供):

Path file = ...;
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);

System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());

16
これが最善ですが、Java 7です。まだ6を使用していますが、アップグレードオプションを調査します。
トッド

1
素晴らしい。まさに必要でした。
RestInPeace 2015年

7
readAttributes(file.toPath(), BasicFileAttributes.class)あなたが得る他の使用:no suitable method found for readAttributes(File,Class<BasicFileAttributes>) method Files.<A>readAttributes(Path,Class<A>,LinkOption...) is not applicable (cannot infer type-variable(s) A (argument mismatch; File cannot be converted to Path))
Hooli

1
@Hooli心配しないで、仲間!このlogicbig.com/how-to/java/file-creation-date.htmlを試してください。
ソクラテス

1
statxLinuxカーネルの新しいバージョンでsyscallが追加されたため、(少なくとも)JDK 8ではファイル作成日を使用できません。
St.Antario 2018

15

このコードでJDK 7を使用してこの問題を解決しました。

package FileCreationDate;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Date;
import java.util.concurrent.TimeUnit;

public class Main
{
    public static void main(String[] args) {

        File file = new File("c:\\1.txt");
        Path filePath = file.toPath();

        BasicFileAttributes attributes = null;
        try
        {
            attributes =
                    Files.readAttributes(filePath, BasicFileAttributes.class);
        }
        catch (IOException exception)
        {
            System.out.println("Exception handled when trying to get file " +
                    "attributes: " + exception.getMessage());
        }
        long milliseconds = attributes.creationTime().to(TimeUnit.MILLISECONDS);
        if((milliseconds > Long.MIN_VALUE) && (milliseconds < Long.MAX_VALUE))
        {
            Date creationDate =
                    new Date(attributes.creationTime().to(TimeUnit.MILLISECONDS));

            System.out.println("File " + filePath.toString() + " created " +
                    creationDate.getDate() + "/" +
                    (creationDate.getMonth() + 1) + "/" +
                    (creationDate.getYear() + 1900));
        }
    }
}

13

この質問のフォローアップとして-特に作成時間に関連し、新しいnioクラスを介してそれを取得することについて議論しているため-現在、JDK7の実装では運が悪いようです。補遺:OpenJDK7でも同じ動作です。

Unixファイルシステムでは、作成タイムスタンプを取得できません。最終変更時刻のコピーを取得するだけです。とても悲しいですが、残念ながら本当です。なぜなのかはわかりませんが、次のコードで示すように、コードはそれを具体的に実行します。

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.*;

public class TestFA {
  static void getAttributes(String pathStr) throws IOException {
    Path p = Paths.get(pathStr);
    BasicFileAttributes view
       = Files.getFileAttributeView(p, BasicFileAttributeView.class)
              .readAttributes();
    System.out.println(view.creationTime()+" is the same as "+view.lastModifiedTime());
  }
  public static void main(String[] args) throws IOException {
    for (String s : args) {
        getAttributes(s);
    }
  }
}

1
Androidでそれを行う方法を知っていますか?BasicFileAttributesは、そこに組み込まれているAPIとして使用できません...
Android開発者

これは確かに本当statです。への呼び出しでさえ機能しません。あなたは高い2.28以上のglibcで高い4.11よりもカーネルを実行するために起こると、8.31よりcoreutilsの高い場合を除き、その後、stat報告します誕生ファイルのを。関連する回答を参照してくださいunix.stackexchange.com/questions/50177/birth-is-empty-on-ext4/…現在、JDKはstatx syscalを使用していません。
Brice、

12

これは、クラスJavaを使用してでファイルの作成日を取得する基本的な例ですBasicFileAttributes

   Path path = Paths.get("C:\\Users\\jorgesys\\workspaceJava\\myfile.txt");
    BasicFileAttributes attr;
    try {
    attr = Files.readAttributes(path, BasicFileAttributes.class);
    System.out.println("Creation date: " + attr.creationTime());
    //System.out.println("Last access date: " + attr.lastAccessTime());
    //System.out.println("Last modified date: " + attr.lastModifiedTime());
    } catch (IOException e) {
    System.out.println("oops error! " + e.getMessage());
}

このクラスの使用を検討している人は、Java 1.7での出荷が始まったことに注意する必要があります。
jwj 2018年

9

のAPIはjava.io.File、最終変更時刻の取得のみをサポートしています。また、このトピックについてもインターネットは非常に静かです。

重要なものを見落とさない限り、Javaライブラリーには(Java 7までは含まれていませんが)この機能は含まれていません。したがって、これが必要な場合の1つの解決策は、システムルーチンを呼び出してJNIを使​​用して呼び出すC(++)コードを記述することです。ただし、この作業のほとんどは、JNAと呼ばれるライブラリですでに行われているようです。

ただし、WindowsとUnix / Linux / BSD / OS Xで利用できる同じシステムコールが見当たらないため、JavaでOS固有のコーディングを少し行う必要があるかもしれません。


2
うん、nioが基本的な属性でこれを持っているように見えるので、Java 7は素晴らしいでしょう。生まれるのが早すぎると文句を言うとは思わなかった!;)
トッド

6
Fileクラスにこの機能がない理由は、ほとんどのファイルシステムがこの情報を追跡することすらできないためです。また、いつ更新するかについて常に同意するわけではありません。
構文

@構文:実際にほとんどのファイルシステムはこの情報を追跡します。例外には、ext <= 3およびReiserが含まれます。FAT、NTFS、HFS、ZFS、およびext4がサポートしています。しかし、Linuxのすべてのレイヤーと、それを広く使用するためのライブラリーおよびコマンドを介して伝播するのは時間がかかりました。
ヒッピートレイル

@Carl Linuxでは、Java NIOを使用しているときに、変更と作成の日付を同じように取得しています。それは正常な行動ですか?
Jayesh Dhandha

それは作成後は何もファイルを変更していない場合@JayeshDhandhaは、私が考え期待の作成と変更時間が等しくなるように。を使用touchして変更時間を変更し、再度チェックして、変更を試すことができます。
Carl Smotricz、

9

Windowsシステムでは、無料のFileTimesライブラリを使用できます。

これは、Java NIO.2(JDK 7)とjava.nio.file.attributeパッケージを使用することで、将来的に簡単になります

ただし、ほとんどのLinuxファイルシステムはファイル作成タイムスタンプをサポートしていないことに注意してください


作成時間をサポートしないLinuxマシンの他の方法はありますか?
マーベリック

ファイル作成のタイムスタンプをサポートするファイルシステムを使用するだけです。リンクされているウィキペディアの記事は、現在非常に一般的なext4を示唆しています。
davtom

1

このコードを使用して、ファイルの作成時間を取得できます!

private static LocalDateTime getCreateTime(File file) throws IOException {
        Path path = Paths.get(file.getPath());
        BasicFileAttributeView basicfile = Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS);
        BasicFileAttributes attr = basicfile.readAttributes();
        long date = attr.creationTime().toMillis();
        Instant instant = Instant.ofEpochMilli(date);
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }

でこのハッスルが必要な理由を詳しく説明してくださいInstant.ofEpochMilli(date)。ありがとう
Kirill Karmazin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.