2012-10-01 4 views
4

외부 프로세스에서 파일 복사가 완료되었는지 여부를 확실하게 알 수있는 플랫폼 간 방법을 찾으려고합니다.현재 파일이 Java로 자라는 지 확인하는 방법 (OS 독립적)

이전 OSX/리눅스에 단순히

File file = new File("path/to/file"); 
file.length() 

후 몇 초 동안 대기하고 변경했다 있는지 다시 확인 확인 된 것입니다.

그러나이 방법은 항상 전체 파일의 크기를 반환하므로 (결국 한 번 복사됩니다) Windows에서는 작동하지 않습니다.

lastModified 타임 스탬프를 확인해 보았지만 변경되지 않은 것으로 보입니다.

+0

모든 OS에는 이러한 기능이 없습니다. 너 뭐하려고? –

+0

완료를 신호하기 위해 데이터 쓰기가 완료되면 플래그 파일을 게시하도록 외부 프로세스에 요청할 수 있습니까? 그게 내가 일반적으로 그것을 어떻게하거나 피드 등을 교환 할 때 외부 데이터 공급자에게 물어보십시오 – amphibient

+0

때마다 새 파일 개체를 만드시겠습니까? 그렇지 않다면, 생성하려고하는 File 객체가 마지막으로 수정 한 시간을 캐싱하고있을 가능성이 있습니다. – Brigham

답변

0

나는 결국에 두 개의 서로 다른 지점에서 (오히려 길이보다) 파일의 체크섬과 해시를 계산하여이를 해결 파일이 아직 쓰여졌는지 여부를 결정하기 위해 시간이 변경되었는지 여부를 확인합니다.

2

하나의 옵션은 사용 쓰기 위해 파일을 열려고하는 것입니다 "추가"FileOutputStream - 당신이 할 수 있다면, 그것은 다른 프로세스가 파일에 쓰는 것을 확률이 낮다. 물론 모든 데이터를 작성할 필요가 없습니다. 단지 스트림을 작성하십시오.

(lastModified를 사용하는 문제에 이미있는 아이디어를 제거 수정 됨.)

+0

내 질문에 명시된 바와 같이, File.lastModified Windows 프로세스에서 변경되지 않는 것 같습니다. FileOutputStream은 Unix 기반 시스템이 아닌 Windows에서 예외를 발생 시키므로 플랫폼 고유의 메소드를 사용할 수는 있지만 모든 곳에서 작동하는 단일 솔루션이 이상적입니다. –

+0

@ThomShutt : 젠장, 나는 질문의'length()'부분 만 보았습니다. 유닉스에서 다른 프로세스가 작성한 파일에 정말로 추가 할 수 있습니까? 이상하게 들리 겠지만 파일 작성 코드에 달려 있다고 생각합니다. –

+0

흥미롭게도이 방법은 로컬 파일에서 작동하지만 네트워크 디렉터리에 기록되는 파일에 대해 어떤 이유로 잠금을 설정할 수 있습니다. –

관련 문제