문제

몇 초마다 디렉토리를 폴링하여 새 입력 파일에 대한 디렉토리를 모니터링하는 응용 프로그램을 작성하고 있습니다. 새 파일은 종종 여러 메가 바이트 일 수 있으므로 입력 디렉토리 (예 : 원격 공유의 사본)에 완전히 도착하는 데 시간이 걸립니다.

파일이 현재 복사중인 과정에 있는지 여부를 감지하는 간단한 방법이 있습니까? 이상적으로 모든 방법은 플랫폼 및 파일 시스템이 불가지론이지만 다른 플랫폼에는 특정 전략이 필요할 수 있습니다.

나는 이미 두 개의 디렉토리 목록을 몇 초씩 가져 와서 파일 크기를 비교하는 것을 고려했지만, 이는 대안이 없다면 내 상사가 만족하지 않는 시간/신뢰성 트레이드 오프를 소개합니다.

배경의 경우, 응용 프로그램은 Matlab M-Files 세트로 쓰여져 있으므로 JRE/CLR 트릭은 두려워합니다 ...


편집하다: 파일은 네트워크 드라이브 또는 로컬 파일 시스템의 다른 위치에서 직선 이동/복사 작업으로 직접 입력에 도착합니다. 이 사본 작업은 아마도 다른 응용 프로그램이 아닌 휴먼 사용자가 시작할 것입니다.

결과적으로 파일 제공 업체에 책임을 배치하여 제어 파일을 추가하거나 중간 준비 영역을 사용하는 것은 매우 어렵습니다 ...


결론: 이 작업을 수행하는 쉬운 방법이없는 것 같습니다. 그래서 벨트 앤 브레이스 접근법을 위해 정착했습니다. 파일이 처리 할 준비가되었습니다.

  • 일정 기간 내에 크기가 변하지 않으며 그리고
  • 파일을 읽기 전용 모드로 열 수 있습니다 (일부 복사 프로세스는 파일에 잠금을 배치합니다).

그들의 답변에 감사드립니다!

도움이 되었습니까?

해결책

이것은 언덕만큼 오래된 중간 문제이며 짧은 대답은 다음과 같습니다.

두 개의 '솔루션'은 파일 Uploader에 onus를 넣습니다. 컨텐츠 파일의 상태를 나타냅니다.

첫 번째는 더 좋지만 둘 다 우아하지 않습니다. 진실은 파일 시스템보다 더 나은 의사 소통 미디어가 존재한다는 것입니다. HTTP 게시물, JMS 또는 MSMQ 대기열과 같은 푸시 또는 풀 (파일 시스템과 마찬가지로 둘 다가 아닌) 만 포함하는 일부 IPC를 고려하십시오. 또한 파일을 수신하는 프로세스를 허용 할 수도 있습니다. 내용을 인정하려면 가치가 있는지 확인하고 고객에게 영수증을 건네주십시오. 이것은 비 반복으로가는 의로운 길입니다. 이것을 따르면 파일이 처리를 위해 서버에 전달되지 않았는지 여부에 대한 논쟁을 절대로받지 못할 것입니다.

중.

다른 팁

가장 안전한 방법은 디렉토리에 파일을 먼저 다른 임시 디렉토리에 넣은 다음 실제 디렉토리로 옮기는 응용 프로그램을 갖는 것입니다 (FTP 또는 파일 공유를 사용할 때에도 원자가 작업이어야 함). . 이름 지정 규칙을 사용하여 하나의 디렉토리 내에서 동일한 결과를 얻을 수도 있습니다.

편집하다:그것은 실제로 파일 시스템에 따라 다릅니다. 복사 기능이 "완성 된 파일"의 개념을 가지고 있는지 여부에 따라 다릅니다. SMB 프로토콜을 잘 모르지만 해당 개념이있는 경우 SMB 인터페이스 (또는 패치 삼바)와 API를 노출하여 완성 된 파일 사본에 알림을받는 앱을 작성할 수 있습니다. 그래도 많은 일이있을 것입니다.

한 가지 간단한 가능성 중 하나는 상당히 큰 간격 (2 ~ 5 분)으로 설문 조사를하고 두 번째로 볼 때만 새 파일 만 인정하는 것입니다.

파일이 잠겨 있는지 확인하는 것 외에는 파일이 여전히 복사되는지 여부를 결정하는 OS의 방법을 모릅니다.

파일은 어떻게 도착합니까? 쓰기로 속성을 설정 한 다음 Write가 완료되면 속성을 변경할 수 있습니까? 이것은 글쓰기를하는 일에 의해 수행되어야합니다 ... 이것은 선택 사항이 아닌 것처럼 들립니다.

그렇지 않으면, 목록을 캐싱하고 파일을 두 개의 연속 목록에 대해 동일한 파일 크기를 가진 경우 파일을 새로운 것으로 처리하는 것이 내가 생각할 수있는 가장 좋은 방법입니다.

또는 파일에서 수정 된 시간을 사용할 수 있습니다. 파일은 새롭고 과거에는 X 이상인 수정 된 시간이 있어야합니다. 그러나 나는 이것이 목록을 캐싱하는 것과 같을 것이라고 생각합니다.

몇 초마다 폴더를 폴링하고 있습니다. 시간 페널티가 많지 않습니까? 그리고 그 플랫폼의 비수성.

또한 Linux 전용 : http://www.linux.com/feature/144666

크론처럼 파일을 위해. 특정 문제를 어떻게 다루는 지 잘 모르겠지만 사용될 수 있습니까?

당신의 OS는 무엇입니까? UNIX에서는 "LSOF"유틸리티를 사용하여 사용자가 쓰기를 위해 파일이 열려 있는지 확인할 수 있습니다. 분명히 MS Windows 프로세스 탐색기 어딘가에 동일한 기능이 있습니다.

대안으로 파일에서 독점 오픈을 시도하고 이것에서 구제를 시도 할 수 있습니다. 그러나 이것은 약간 신뢰할 수없고 자신의 발가락을 쉽게 밟을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top