Java에서 파일 생성 날짜 결정


102

StackOverflow ( Java에서 파일 생성 날짜를 얻는 방법) 에 대한 또 다른 유사한 질문이 있지만 OP에는 다른 메커니즘을 통해 해결할 수있는 다른 요구가 있었기 때문에 대답은 실제로 없습니다. 연령별로 정렬 할 수있는 디렉터리에 파일 목록을 만들려고하므로 파일 생성 날짜가 필요합니다.

나는 웹을 많이 트롤링 한 후에 이것을 할 좋은 방법을 찾지 못했습니다. 파일 생성 날짜를 가져 오는 메커니즘이 있습니까?

현재 Windows 시스템에있는 BTW는 Linux 시스템에서도 작동하기 위해이 기능이 필요할 수 있습니다. 또한 생성 날짜 / 시간이 이름에 포함 된 위치에서 파일 명명 규칙을 따를 것이라고 보장 할 수 없습니다.


2
좋아요, 파일 시스템에 대한 더 많은 논의와 조사 끝에 우리는 마지막 수정을 사용하는 것으로 충분하다고 결정했습니다. 생성 날짜와 함께 확인해야하기 때문입니다. 이전 파일이 최근에 수정되었으므로 여전히 활성 상태인지 확인하려면 둘 다 확인해야합니다. 따라서 과거에 가장 많이 수정 된 파일을 확인하십시오. 모든 입력에 감사드립니다. BTW, 나는 nio를 사용하고 싶지만 여기의 Linux 풍미는 어쨌든 파일 생성을 지원하지 않습니다.
Todd

답변:


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을 사용하고 있지만 업그레이드 옵션을 조사하겠습니다.
Todd

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
statx최신 Linux 커널 버전에서 syscall이 추가되었으므로 JDK 8 (적어도)에서는 파일 생성 날짜를 사용할 수 없습니다 .
St. Antario

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에서 수행하는 방법을 알고 있습니까? 이 API 내장으로 BasicFileAttributes은 ... 사용할 수 없습니다
안드로이드 개발자

이것은 사실입니다.에 대한 호출조차도 stat작동하지 않습니다. 당신이 8.31보다로 coreutils 높은 2.28보다 높은 glibc에 함께 4.11보다 커널 높은 실행하는 일, 그리고하지 않는 한, 다음 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

9

의 API java.io.File는 마지막 수정 시간 가져 오기만 지원합니다 . 그리고 인터넷은이 주제에 대해서도 매우 조용합니다.

중요한 것을 놓치지 않는 한 Java 라이브러리는있는 그대로 (Java 7까지 포함되지 않음)에는이 기능이 포함되어 있지 않습니다. 따라서이를 위해 절실한 경우 한 가지 해결책은 시스템 루틴을 호출하고 JNI를 사용하여 호출하는 C (++) 코드를 작성하는 것입니다. 하지만이 작업의 대부분은 JNA 라는 라이브러리에서 이미 완료된 것으로 보입니다 .

Windows 및 Unix / Linux / BSD / OS X에서 사용 가능한 동일한 시스템 호출을 찾을 수 없기 때문에이를 위해 Java에서 약간의 OS 특정 코딩을 수행해야 할 수도 있습니다.


2
예, nio가 기본 속성에 이것을 가지고있는 것처럼 보이기 때문에 Java 7은 훌륭 할 것입니다. 너무 일찍 태어 났다고 불평 할 줄은 몰랐어요! ;)
Todd

6
File클래스에이 기능이없는 이유는 대부분의 파일 시스템이이 정보를 추적하지 않기 때문입니다. 그리고 업데이트해야 할 때 항상 동의하지 않는 사람들.
Syntactic

@Syntactic : 실제로 대부분의 파일 시스템은이 정보를 추적합니다 . 예외에는 ext <= 3 및 Reiser가 포함됩니다. FAT, NTFS, HFS, ZFS 및 ext4가이를 지원합니다. 그러나 Linux의 모든 계층과 라이브러리 및 명령을 통해 널리 전파되어 보편적으로 사용되도록하는 것은 느립니다.
hippietrail

@Carl Linux에서 Java NIO를 사용하는 동안 수정 및 생성 날짜가 동일합니다. 정상적인 행동입니까?
Jayesh Dhandha

@JayeshDhandha, 파일이 생성 된 후 파일을 수정하지 않으면 생성 및 수정 시간이 동일 할 것으로 예상 합니다. 를 사용 touch하여 모드 시간을 변경 한 다음 다시 확인하여 변경할 수 있습니다.
Carl Smotricz

9

Windows 시스템에서는 무료 FileTimes를 사용할 수 있습니다. 라이브러리를 있습니다.

Java NIO.2 (JDK 7) 및 java.nio.file.attribute 패키지 를 사용하면 앞으로 더 쉬워 질 것입니다. 입니다.

그러나 대부분의 Linux 파일 시스템 은 파일 생성 타임 스탬프를 지원하지 않습니다 .


생성 된 시간을 지원하지 않는 리눅스 머신을위한 다른 방법은 없나요?
Maverick

파일 생성 타임 스탬프를 지원하는 파일 시스템을 사용하십시오. 연결된 Wikipedia 기사는 현재 매우 일반적인 ext4를 제안합니다.
davtom

1

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

왜 우리에게이 번잡함이 필요한지 자세히 설명해 주시겠습니까 Instant.ofEpochMilli(date)? 감사합니다
키릴 Karmazin에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.