2011-04-10 5 views
3

수정 기간 동안 매 x 초마다 디렉토리를 검색하는 C 언어의 프로그램을 만들고 있지만 파일이나 디렉토리가 만들어 질 때 알아내는 데 어려움이 있습니다. 다음은 내가 고려한 몇 가지 옵션입니다.C를 사용하면 파일이 작성된 시점을 어떻게 알 수 있습니까?

  • 마지막 상태 변경 및 데이터 수정 타임 스탬프가 동일한 지 확인하십시오. 이것은 파일을 만들 수 있고, 프로그램이 그것을 검사 할 기회를 가지기 전에 수정할 수 있으며, 데이터 수정 타임 스탬프를 변경하고 더 이상 새로운 파일로 보지 못하는 문제를 야기합니다.

  • 디렉토리에있는 모든 파일/디렉토리의 이름을 기록하고 새 디렉토리를 확인하십시오. 이 문제는 파일을 삭제 한 다음 동일한 이름으로 새 파일을 만들면 새 파일로 해석되지 않습니다.

  • 파일/디렉토리의 수를 유지하십시오. 마지막 아이디어에 대한 Similliar 문제.

그 말로는 누구나 파일/디렉토리의 생성을 고유하게 식별 할 수있는 방법에 대한 아이디어가 있습니까?

+0

코딩 환경에 따라 다릅니다. 현대 운영 시스템은 대개 디렉토리 변경을 모니터링하는 방법을 구현합니다. –

+0

휠을 재발 명하지 마십시오. OS 고유의 메커니즘을 사용하십시오. – crazyscot

답변

1

아마도 inotify을 사용해야합니까?

4

적어도 그렇게 할 수는 없습니다. POSIX는 파일 시스템에 시간을 저장하는 조항이 없습니다 (예 : Windows 및 일부 다른 OS). 상태 변경, 액세스 및 수정 시간 만 유지합니다. 대부분의 유닉스 파일 시스템은 그 정보를 저장하지 않는다.

파일 타임 스탬프가 디렉토리 참조가 아닌 inode에 저장되므로 하드 링크가 존재하는 이유 중 하나입니다. 10am에서 만든 파일을 11am에 다른 디렉토리에 하드 링크 한 파일의 생성 시간을 어떻게 생각하십니까? 파일을 복사하면 어떻게됩니까?

유감스럽게도 OS 고유의 접근 방식은 플랫폼에서 사용 가능한 모든 프레임 워크를 사용하여 파일 시스템 이벤트를 모니터하는 것입니다. inotify on Linux와 FreeBSD와 맥 OS X에 kqueue ...

편집 : 그런데

, 리눅스에 Ext4fs 저장 않습니다 아이 노드 생성 시간 (crtime). 불행히도 사용자 공간에서 해당 정보를 얻는 것은 여전히 ​​최소한 awkward입니다.

+0

inotify가 좋습니다. 그래도 특별한 경우를 처리 할 수 ​​있습니다. 디렉토리를보고, 모든 이벤트를 듣고, 예를 들어 gedit을 열고, 무언가를 쓰고보고있는 디렉토리에 저장하십시오. 재미있는 일들이 일어날 것입니다. – manneorama

+1

@manneorama : inotify의 최악의 문제는 재귀 시계가 없다는 것입니다. userspace 응용 프로그램 자체 재귀 시계를 설정해야합니다 ... – thkala