web-dev-qa-db-ja.com

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

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

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

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

95
Todd

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

例(@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());
151
ring bearer

このコードで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);
    }
  }
}
13
David Nugent

これは、 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());
}
11
Jorgesys

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

これは将来的に Java NIO.2(JDK 7)およびJava.nio.file.attributeパッケージ でより簡単になるでしょう。

しかし、ほとんどのLinuxファイルシステム ファイル作成タイムスタンプをサポートしない であることを忘れないでください。

9
Jacek S

Java.io.FileのAPIは、最後のmodified時間の取得のみをサポートします。また、インターネットもこのトピックに関して非常に静かです。

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

ただし、WindowsとUnix/Linux/BSD/OS Xで同じシステムコールを使用できるとは思われないので、Javaで少しOS固有のコーディングを行う必要があります。

9
Carl Smotricz

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

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());
    }
1
zhangxinqiang