É possível obter o nome do arquivo de um ID FSEvent?
Pergunta
Criei um observador de sistema de arquivos simples em C++ usando a API Mac File System Events conforme documentado aqui: documento de desenvolvedor da Apple.Minha pergunta está no título.Como obtenho o caminho da coisa que foi alterada?A matriz eventPaths me fornece apenas o caminho do diretório pai (ou conjunto dele) que estou essencialmente observando.Mas não a entrada do diretório subjacente que foi modificada.
Posso obter informações úteis usando o retorno de chamada, ou seja:
static void mycallback(
ConstFSEventStreamRef streamRef,
void *clientCallBackInfo,
size_t numEvents,
void *eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
Estou pensando que talvez o nome possa ser extraído de um desses itens?
EDITAR:
Por exemplo, pode-se descobrir que um arquivo é criado e, nesse caso, um
kFSEventStreamEventFlagItemCreated
é levantado.Mas como devo proceder para obter o nome real desse item?(Da mesma forma para outros eventos, como quando um item é excluído, etc.).
EDITAR 2:
Estou começando a pensar que não será possível fazer o que quero.De Visão geral da tecnologia FS:
"O ponto importante a ser retirado é que a granularidade das notificações está no nível do diretório.Ele informa apenas que algo no diretório foi alterado, mas não informa o que mudou."
Também conhecido como.Droga.
Saúde,
Ben.
Solução
Na verdade, isso é possível, mas apenas em 10.7+.Confira o sinalizador kFSEventStreamCreateFlagFileEvents para FSEventStreamCreate (docs aqui).
Outras dicas
Infelizmente, como descobri, não é possível;ver Visão geral da tecnologia FS para uma explicação/motivação.Uma solução alternativa seria tirar um instantâneo do diretório e, sempre que uma alteração for descoberta, tirar um novo instantâneo e compará-lo com o original, para encontrar as entradas específicas do diretório (e seus nomes) que foram alteradas.
EDITAR:É possível em >=10,7 (ver resposta escolhida)