Observe um arquivo ou pasta no Objective-C

Qual é a melhor maneira de ouvir uma pasta ou arquivo para ver se foi salvo ou se um novo arquivo foi adicionado?

A API do FSEvents é ideal se você quiser apenas assistir a diretórios, mas não lida com o monitoramento de arquivos individuais. Stu Connolly tem um ótimo wrapper Objective-C para a API FSEvents C, é chamado SCEvents e você pode obtê-lo aqui:

http://stuconnolly.com/blog/scevents-011/

A coisa boa sobre o FSEvents é que você só precisa assistir a uma pasta e será notificado de quaisquer alterações que ocorram em qualquer lugar na hierarquia de subpastas dessa pasta.

Se você precisar de notifications em nível de arquivo, precisará usar kqueues. O Uli Kusterer tem um ótimo wrapper Objective-C:

http://zathras.de/angelweb/sourcecode.htm#UKKQueue

Qualquer um desses methods é muito mais fácil do que disputar diretamente com as APIs C, que não são particularmente bem documentadas e um pouco obtusas.

Se você precisar dar suporte ao Tiger, precisará usar os kqueues, já que a API do FSEvents não estava oficialmente disponível em 10.4.

Tente usar o FSEvents , embora seja uma API C

OS 10.5 ou mais recente

Se você estiver alterando um arquivo ou pasta, acredito que o mecanismo de pesquisa Spotlight atualizará seu database para refletir suas alterações.

Portanto, você pode configurar um thread que ouça as notifications do kMDQueryDidUpdateNotification por meio de uma consulta Spotlight específica para esse arquivo ou pasta.

Quando você receber essas notifications, você pode triggersr um seletor que faz algo que você deseja.

Se você precisar usar o kqueue (como discutido em outras respostas), o Google Toolbox para Mac tem um bom wrapper Objective-C que eu usei sem problemas até o momento.

Não tenho certeza qual é o melhor caminho, mas Uma maneira seria acionar um NSThread que regularmente (por exemplo, a cada segundo) verificar as datas de criação dos arquivos no diretório e, em seguida, ter um delegado associado a esse segmento para executar alguma ação quando um novo arquivo foi adicionado