2009-03-25 3 views
3

파일에 열린 파일 핸들이있는 프로세스가 있습니다. 이 파일이 다른 프로세스에 의해 삭제되었는지 (같은 이름의 파일이있을 수 있음) 감지해야합니다. 유닉스에서 파일 핸들의 inode와 파일 경로의 inode를 stat를 통해 비교했지만 이것은 Win32에서는 작동하지 않습니다. Perl에서 이것을 어떻게 할 수 있습니까?열린 파일 핸들의 파일이 Windows에서 Perl을 사용하여 삭제되었는지 어떻게 알 수 있습니까?

감사합니다,

- 피터

답변

7

필자는 실수로 (필자는 Windows 프로그래머가 아닙니다.) 필자가 Win32에서 열었을 때 파일을 삭제하거나 바꿀 수 없다고 생각했거나 적어도 기본적으로 불가능하다고 생각했습니다.

+0

네, 알다시피 Windows는 열린 파일을 삭제할 수 없습니다. – Powerlord

+0

네, 이것이 근본적인 문제였습니다. 필자는이 파일을 쓸 때마다 파일을 다시 열고 고유 한 파일 ID (볼륨 직렬 번호와 커널이 얻은 파일 고/저 인덱스를 결합하여 생성 된)를 작성하고 비교하여이 문제를 해결해야했습니다. API 호출 : GetFileInformationByHandle). – user24881

1

내가 크기에 mtime 및 atime에 비교하려고 할 것; 파일 핸들이 삭제 된 인스턴스에 있는지 여부에 관계없이 파일 시스템의 현재 파일에 대한 정보를 제공하는 win32의 파일 핸들에 대한 말처럼 말도 안되는 것을 제외하고는 동일하지 않아야합니다. 파일을 삭제하고 주어진 파일에서 동일한 파일로 여러 번 바꿀 수 있고이를 감지해야하는 경우 파일 번호가 매겨진 버전을 사용하는 것과 같은 아키텍처 솔루션을 사용해야 할 수도 있습니다.

1

Win32 :: ChangeNotify 패키지를보고 파일이나 디렉터리에 대한 변경 알림을 등록하십시오. 또한 Win32API :: File 패키지를 통해 파일을 열 수 있습니다 (예 : MSDN의 CreateFile() 문서뿐 아니라 createFile() 및 OsFHandleOpen() 참조) 특히 삭제 중에는 파일을 열 수 없습니다.

2

특히 Windows와 Unix 모두에서 해결해야 할 어려운 문제입니다.

백업 해주세요. 파일이 대체되었는지 검색하는 이유는 무엇입니까? 내 추측으로는 어떤 종류의 경쟁 조건이 있으며, 두 프로그램 모두 동일한 파일에 쓰려고합니다. 아마도 파일 잠금이 도움이 될까요? 또는 실제 데이터베이스를 사용 하시겠습니까? SQLite와 Berkley DB가 마음에 듭니다.

관련 문제