Eu tenho um aplicativo que procura seus arquivos de dados (* .txt) em uma pasta. Eu tenho duas pastas contendo dados de texto que preciso manter separados, mas seria útil fazer com que o aplicativo veja os arquivos de dados de texto como residindo em uma pasta (contendo os dois conjuntos de arquivos).
Posso criar um script que mantém links simbólicos para os arquivos nas duas pastas em uma terceira pasta combinada.
Em vez de reinventar a roda, eu gostaria de usar uma solução comprovada, se possível.
A solução teria que lidar com o caso de conflitos de nome de arquivo de maneira sensata.
text
filesystem
smart-folders
Stuart Woodward
fonte
fonte
Respostas:
Você poderia usar
launchd
.launchd
permite gerenciar daemons e agentes de acordo com determinadas condições.O que são daemons e agentes?
De
man launchd
:Em http://developer.apple.com/library/mac/#technotes/tn2083/_index.html :
O daemon / agente é descrito em um arquivo XML com extensão plist. Uma das condições que podem ser monitoradas são as alterações em uma pasta . Isto virá a calhar.
OK, vamos sujar as mãos:
Digamos que estas são as 2 pastas em que você e seu amigo mantêm seus arquivos:
e esta é a pasta comum para o aplicativo:
Queremos monitorar os dois caminhos acima e sincronizar seu conteúdo com
/tmp/folder
.Esta é a lista que faz o que precisamos:
O plist monitora as duas pastas com a chave
WatchPaths
(consulte http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/10000172i-SW7 -SW8 ).Eu sugiro o programa
rsync
para sincronizar pastas. A opção--delete
garante que os arquivos excluídos nas pastas monitoradas também sejam excluídos/tmp/folder
. Outras opções são-aE
para copiar padrão e estendido atributos HFS +, e--exclude='.*'
saltar.localized
,.DS_Store
e outros arquivos ocultos.Eu adicionei
ThrottleInterval
caso você queira definir o intervalo mínimo que um trabalho pode gerar. O valor padrão é 10 s, ou seja, os trabalhos não serão gerados mais de uma vez a cada 10 segundos.Salve o plist (veja
man launchd
uma lista de caminhos possíveis) como:Crio:
e carregue (ou seja, habilite) o plist:
Agora crie um arquivo em
/tmp/folderstuart
:e veja a mágica acontecer:
file.txt
será criada em segundos em/tmp/folder
. Exclua-o e ele desaparecerá/tmp/folder
. Ele também sincronizará os arquivos criados ou excluídos/tmp/folderstuartsfriend
.Observe que esta solução não lida com colisões de nomes! Se você não puder garantir que os arquivos sejam nomeados de maneira diferente, substitua o rsync por um script que rsyncs e faça a verificação do nome do arquivo para evitar a perda de dados.
Se a cópia de arquivos não for uma opção, substitua
rsync
por um script que crie links físicos (se os dois arquivos estiverem no mesmo sistema de arquivos, eu recomendaria links físicos em vez de links simbólicos). Antes de mudar o plist, descarregue-o:Quando terminar, carregue-o novamente.
fonte
/tmp/folder
precisa ser tratada como somente leitura, porque as alterações feitas lá não serão propagadas de volta para as outras pastas. Além disso, como jaume observou, colisões de nomes resultarão em um arquivo substituindo o outro. Com algum trabalho (editando manualmente o arquivo XML), você pode criar uma Pasta Inteligente que contém.txt
arquivos de ambas as pastas. Isso funcionaria para o seu aplicativo?Por que não usar uma palavra-chave ou Comentário do Spotlight para marcar os arquivos em cada pasta e, em seguida, uma Pasta Inteligente para mostrá-los juntos?
fonte