2009-11-20 8 views
26

주어진 디렉토리가 (직접 또는 간접적으로) 파일이 수정 될 때 코드에 알리고 싶습니다. "수정 된"이란 말은 파일의 내용이 변경되거나 이름이 변경되거나 삭제 될 때마다 코드에 알림을 보내려고한다는 뜻입니다. 또는 새 파일이 추가 된 경우. 내 응용 프로그램에는 수천 개의 파일이있을 수 있습니다.Mac OS X의 파일 레벨 파일 시스템 변경 알림

나는 FSEvents로 보였지만, 그 기술 개요는 말한다, 부분적으로 :

빼앗아해야 할 중요한 점은 통지의 단위가 디렉토리 레벨에 있다는 것입니다. 디렉토리의 어떤 내용이 변경되었음을 알려주지 만 변경된 내용은 알려주지 않습니다.

또한 말한다 :

파일 시스템 이벤트 API도 때 특정 파일 변경을 찾기 위해 설계되지 않았습니다. 이러한 목적을 위해 큐 큐 메커니즘이 더 적절합니다.

그러나 주어진 파일에서 kqueue를 사용하려면 파일 설명자를 얻기 위해 파일을 열어야합니다. 수천 개의 파일 설명자를 관리하는 것은 비실용적입니다 (어쨌든 최대 허용 가능한 파일 설명자 수를 초과 할 수도 있습니다).

Windows에서는 궁금한 점이있어서 ReadDirectoryChangesW() 기능을 사용할 수 있으며 원하는대로 정확하게 처리 할 수 ​​있습니다.

그래서 Mac OS X에서 내가 원하는 것을 어떻게 할 수 있습니까? 또는 다른 방법을 묻습니다. 사용자 공간에서 Mac OS X 용 ReadDirectoryChangesW()에 해당하는 글을 쓰려면 어떻게해야할까요? (매우 효율적입니까?)

답변

6

나 자신이 시도하지 않은,하지만 FSEvents는 10.7 (사자)의 같은 파일 수준의 알림을 제공 할 수있는 것처럼 보인다 : 설명, 데미지 및 소스 코드에 대한 링크를 참조하십시오. the description of FSEventStreamCreateFlags에서 :

kFSEventStreamCreateFlagFileEvents

요청 파일 수준 알림. 스트림은 디렉토리 수준 알림 만 수신하는 대신 시청중인 계층 구조의 개별 파일에 대한 이벤트를 수신합니다.이 플래그를 사용하지 않으면보다 많은 이벤트를 생성하므로주의해서이 플래그를 사용하십시오.

OS X v10.7 이상에서 사용할 수 있습니다.

8

편집 : 확인되지 않음,하지만 콘스탄틴이 코드 샘플은 2012 년

난 당신이 무엇을 찾고 있는지에 대한 특정 API가있다 생각하지 않습니다의로 사용되지 않습니다 것을 아래에 나타냅니다. Apple은 Watcher과 비슷한 문제에 대한 샘플 코드를 제공합니다. 그것은 당신이 찾고있는 것이 아니지만, 당신이이 시점에서 할 수있는 최선의 방법입니다. 디렉토리의 스냅 샷을 가져 와서 변경된 것을 발견하면 다시 검색해야합니다. 변경 시간을 신뢰할 수 있다면 변경 시간은 물론 확인하는 것이 가장 좋습니다.

무제한으로 kqueues를 등록하려고하면 실제로 작동하지 않을 가능성이 큽니다.

+0

나는 일반적으로 Windows 프로그래밍을 좋아하지 않으며 Mac/Linux 프로그래밍을 선호합니다. 분명히 Windows에서하는 것이 더 쉬운 적어도 한 가지가 있다는 것이 기괴한 것 같습니다. –

+3

아, Windows에서 할 일이 많습니다. Cocoa를 사용하여 SOAP에 대해 이야기 해보십시오. NSArray는 좋지만 때로는 C# 스타일 제네릭을 매우 환영 할 수 있습니다. Mac은 ASP.NET과 거의 비슷합니다 (WebObjects를보고 있습니다). 나는 코코아를 사랑한다. 지금까지 내가 만난 최고의 프레임 워크입니다. 그러나 Windows보다 Mac의 개발자가 모든 것이 더 좋다고 생각하는 사람은 두 가지 모두에서별로 발전하지 못했습니다. 이런 식으로 zfs라는 거룩한 성배를 기다리고 있습니다. 이런 종류의 물건을 더 쉽고 빠르게 만들 수 있습니다. 언젠가 ... (마이크로 소프트도 winfs에 대한 꿈을 가지고 있습니다 ...) –

+1

문제는 당신이 Mac 프로그래밍으로 리눅스 프로그래밍을 모으고 있다는 것입니다. 이것은 inotifywait으로 Linux에서 매우 쉽게 할 수 있습니다. – MarkovCh1

-2

man fs_usage을 확인할 수도 있습니다. 디렉토리에만 국한되지는 않으며 루트 권한이 필요합니다.

2

Mac OS X에서 필요로하는 가장 유사한 유틸리티 (알고있는 것)는 fslogger입니다. 이 OSXBook - fslogger