2011-12-27 2 views
1

디렉토리를 모니터링하고 파일이 열리면 열어서 처리 한 다음 다른 디렉토리로 이동하십시오. 문제는 다른 프로그램이 그것을 작성했는지 확인하는 방법입니다. Java 7에서는 FileSystem의 WatchService를 사용할 수 있지만 파일을 만들 때만 확인할 수 있습니다. 내가 원한 것은 모든 파일 핸들이 언제 공개되는지를 아는 것이다.모든 파일 핸들이 Java에서 해제 될 때 확인하십시오.

내 첫 번째 생각은 독점적 인 잠금을 얻을 수 있지만 실제로 파일을 업데이트하는 동안 다른 응용 프로그램을 종료 할 수 있다는 것이 밝혀졌습니다.

Java에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 감사!

+1

당신이 할 수있는 유일한 것은이 프로그램이 완료 나타내는 파일을 찾을 것입니다 그걸로. –

+0

@PeterLawrey : 불행히도, 내 프로그램은 파일을 생성 할 수있는 프로그램에서 파일을 가져올 수 있어야하며 추가 파일을 만들 수있는 방법이 없습니다. –

답변

1

현재 Watcher API를 사용하면 감시 된 디렉토리에서 파일 시스템 오브젝트를 작성, 수정 또는 삭제할 때 이벤트를 볼 수 있습니다. 그들은 다른 inotify 이벤트 (Linux에서)에 대해 알려주지 않습니다. 사실, 나는 순수 자바에서 이것을 수행 할 방법이 없다고 생각한다.


나는 몇 주 전에이 나 자신 할 수있는 방법을 찾고 있었고, 난 당신이 다른 파일을 지원하는 파일 감시자을 제공 FileSystem API의 사용자 지정 구현을 쓸 수 있다고 제안 메일 스레드를 건너 왔어요 시스템 이벤트. 나는 내가보고있는 파일이 어떻게 생산되고 있는지에 대한 지식에 기초한 대안적인 해결책이 있었기 때문에 그것을 추구하지 않기로 결정했다.

필자의 경우 파일은 공유 드라이브에 이미지 파일을 저장하는 도구로 생성됩니다. 해결책은 새로 생성 된 파일에 대한 "수정 된"이벤트 스트림을 보는 것입니다. 그것이 멈추었을 때 더 이상 몇 초 ("정착 시간") 동안 나오지 않으면 파일을 처리 할 수 ​​있습니다.

이 솔루션이 신뢰할 수 없다고 판명되면 대체로 inotify 호출을 직접 사용하여 C/C++에서보고 및 초기 처리 (파일의 스냅 샷 찍기)를 구현해야합니다. 이렇게하면 파일 닫기 이벤트를 직접 관찰 할 수 있습니다.

+0

감사! 그건 의미가 있습니다. 내가 끝내 버린 것은'WatchService'를 포기하고 주어진 시점에 디렉토리에있는 파일의 스냅 샷을 찍은 다음 몇 초 후에 새로운 파일을 찍는 것이 었습니다. 이러한 스냅 샷의 교차 부분에있는 변경되지 않은 파일은 처리하기에 안전한 것으로 간주됩니다. 나중에 이것에 대한 버그 보고서를 받으면 다시 작성하겠습니다.하지만 지금은 요구 사항을 충족한다고 가정하겠습니다. –

1

filebased 인터페이스에 대한 가장 간단한 방법은 다음과 같습니다

  1. 보낸 사람이 보낸 사람이 파일을 작성이 완료되면
  2. , 그는 이름을 변경 변경된 파일 이름 (예 : "example.xml_")으로 파일을 기록 그것은 (예 : "example.xml_"을 "example.xml")에 대해서만
  3. 수신기 스캔 "* .XML"
+1

1) 이것은 파일을 만드는 모든 것을 제어 할 수있는 경우에만 작동하며, 필요에 따라 파일의 이름을 변경하여 수정할 수 있습니다. 2) 스캐닝은 폴링을 포함하고 비효율적이다. 'WatchService'를 사용하십시오. –

관련 문제