파일을 폴더로 이동시키는 Perl 스크립트가 있습니다. 실행될 때마다 폴더의 파일 이름을 검사합니다. 하지만 더 큰 파일을 가지고 있다면 파일 이름을 검사 할 때 움직일 준비가되지 않았을 수 있습니다. 정말 엉망이 될 수 있습니다. 루프의 끝에서 멈추고 계속 진행하기 전에 이동이 끝났는지 확인하고 싶습니다.파일 이동이 perl에서 완료되었는지 확인하는 방법은 무엇입니까?
답변
세 가지 일반적인 접근법.
- 파일 크기를 모니터링하십시오. X 초 동안 크기가 변경되지 않았 으면 파일이 완료되었다고 가정합니다. 구현이 쉽고 오류가 발생하기 쉽습니다.
- 이동 된 파일이 완료되면 다음에 마커 파일 을 업로드하십시오. 원래 파일 대신 마커가 있는지 확인하십시오.
- 다른 이름을 사용하여 파일을 복사하십시오. 전송이 완료되면 이름을 변경하십시오.
처음 두 개를 이해합니다. 원래 파일이 존재하는지 확인하는 것이 더 쉬운 해결책입니다. 3 번 설명 할 수 있니? 나는 그것을 어떻게 모니터 할 수 있는지 이해하지 못한다. 파일을 이동 한 후 완료되면 이름을 원래대로 변경 하시겠습니까? – TheAdam122
예. 파일을'your_file_name.in_progress'로 옮깁니다. 이동이 끝나면 이름을 'your_file_name'으로 바꿉니다. 동일한 파일 시스템을 사용하는 한 이동은 일반적으로 거의 순간적입니다. 실제로 데이터를 이동하는 것보다는 디렉토리 테이블을 업데이트하는 것입니다. –
고마워, 이제는 파일을 이동하는 동안 실제로 파일 이름을 변경한다는 사실을 이해합니다. 파일을 한 디스크에서만 옮기는 경우에는 약간의 시간이 걸리며 프로그램은 약 10,000 개의 파일 (약 3 개의 파일)로 작동합니다. 그것은 프로그램을 느리게 만들 것이므로 가능한 한 적은 수의 액션을 원합니다. 이상적인 체이스가 거짓 인 조건을 선호하므로 필요한 경우에만 프로그램이 대기하지 않습니다. – TheAdam122
sleep 1 while -e $original_filename;
수많은 옵션과 옵션 동안 심지어 무한 있습니다,하지만 당신은 파일이 존재하지 않을 경우 영구 루프에 스크립트를 넣어하지 않도록하기 위해 코드를 포맷해야합니다.
괜찮아요,하지만 반대 방향으로하는 것이 좋습니다 : sleep 1 while - e $ original_filename; 파일이 대상 디렉토리에 존재할 수 있기 때문에 프로그램이 여전히이 파일에 쓰고 있기 때문에 원래 파일 이름이 사라지면 계속할 수있는 완벽한 시간입니다. – TheAdam122
그것은 소리가 나는 것처럼 좋지 않습니다 - 실제로는 큰 파일이 존재할 것이지만 부분적으로 만 쓰여질 것입니다. – Sobrique
@ 아담, 수정 예. 나는 원래의 파일 –
코드를 게시하십시오. –
아마도 루프가 끝난 후 새 위치에 파일이 있는지 확인할 수 있습니다. – Mohit
답변을 제공하는 것은 너무 모호합니다. 당신이 필요로하는 것은'flock'과 같은 일종의 잠금 메커니즘입니다 - – Sobrique