일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 사진
- 풍경
- 85mm 1.8g
- AF-S NIKKOR 18-35mm f/3.5-4.5G ED
- 50mm
- 경치
- 출사
- AF-S NIKKOR 50mm f/1.8G
- spring
- 여름성경학교
- 푸른초장교회
- AF-S NIKKOR 85mm f/1.8G
- 18-35mm
- 렌즈
- Photo
- 50mm f/1.8G
- 푸초
- 니콘
- daily
- AF-S 18-35mm
- nikkor
- Nikon
- camera
- 카메라
- af-s 18-35
- 꽃
- 하늘풍경
- 85mm f/1.8G
- 일상
- D750
- Today
- Total
병갈이 블록
JAVA - File의 생성일자/수정일자 수정.(Mac 기준) 본문
파일의 시간 정보 수정을 위해 사용하는 기본 클래스와 함수.
Files.setAttribute(Path path, String attribute, Object value, LinkOption...options)
예를 들면 아래와 같이 쓸 수 있다.
Files.setAttribute(new File("file.txt").toPath(), "basic:creationTime", FileTime.fromMillis(new Date().getTime()), LinkOption.NOFOLLOW_LINKS);
각각의 항목을 보자.
- path : 대상 파일의 Path타입을 세팅.
- attribute : 수정할 항목.
- value : 항목에 대한 값. 찾아보진 않았지만 시간의 경우 대부분 FileTime타입으로 세팅을 하고 있었다.
- options : NOFOLLOW_LINKS - Do not follow symbolic links. 심볼릭 링크를 따르지 말라. 말 그대로인듯. 테스트해보진 않았다.
우선, Attribute를 가져와본다.
BasicFileAttributes bfa = Files.readAttributes(new File("file.txt").toPath(), BasicFileAttributes.class);
그리고 AttributeBasicFileAttributes 객체에서 호출 할 수 있는 시간 관련 항목은 아래와 같다.
bfa.creationTime() - 생성일자.
bfa.lastModifiedTime() - 마지막수정일자.
bfa.lastAccessTime() - 마지막접근일자.
출력을 해보면 각각의 항목은 파일정보에서 확인하는것과 동일하다.
자, 그럼 다시 위의 내용과 연결해서 봤을 때 attribute에 "creationTime"으로 하고 Files.setAttribute를 수행하면 생성일자가 수정될 거라고 예상이 되었다. 하지만 실패. 해외사이트도 찾아보았지만 전부 "creationTime"으로 세팅되어 있어서 앞에 basic키워드를 넣어 보았지만 역시나 실패. 함수 자체가 안먹히는건가 하는 생각에 다른 항목을 수정해보다가 그 답을 찾았다.
결과부터 이야기를 하면, "lastModifiedTime"을 수정하였을 때 현재 "creationTime"이 수정될 "lastModifiedTime"의 시간보다 미래라면, "creationTime"도 함께 수정이 된다. 코드로 조건을 표현해 보면 아래와 같다.
if(creationTime > inLastModifiedTime){
creationTime = inLastModifiedTime;
}
lastModifiedTime = inLastModifiedTime;
if(creationTime > inLastModifiedTime){
creationTime = inLastModifiedTime;
}
lastModifiedTime = inLastModifiedTime;
다시 코드를 보게되면 아래와 같이 수정해야 된다.
Files.setAttribute(new File("file.txt").toPath(), "basic:lastModifiedTime",
FileTime.fromMillis(new Date().getTime())
, LinkOption.NOFOLLOW_LINKS);
Files.setAttribute(new File("file.txt").toPath(), "basic:lastModifiedTime", FileTime.fromMillis(new Date().getTime()), LinkOption.NOFOLLOW_LINKS);
이부분을 찾게 된 이유는 파일명을 수정하는 배치를 만드는 중, 파일을 생성년도/월 기준으로 폴더를 생성하고 그 아래 파뀐 파일 이름으로 이동시키도록 만들게 되면서, 이동된 파일의 생성일/수정일이 파일이 만들어진 시점으로 만들어진걸 확인하게 되면서다. 아무래도 시간 정보는 원본과 동일하게 유지할 필요가 있다고 판단했고 방법을 찾기 시작했는데 생각보다 자세한 설명이 있는 곳을 찾을수가 없었다. 뒷걸음치가 얻어걸린거긴 하지만 어쨌든 찾았으니까 기록해둔다.(파일이동은 Files.move()로 쉽게 처리할 수 있음. 기존 메타정보 그대로 유지됨)
아, window가 없어서 window os에서도 동일하게 처리되는지는 확인하지 못했다. 어디까지나 macOS Big Sur에서 유효한 방법이었다. 누가 윈도우에서도 동일한지 확인해주면 감사할텐데...무튼. 끝!