Como criar uma pasta inteligente como uma pasta física com o conteúdo combinado de duas pastas

2

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.

Stuart Woodward
fonte
1
O que não está comprovado sobre a solução de script? Você precisará de alguma codificação para resolver conflitos de nomes de qualquer maneira, somente as Pastas Inteligentes não ajudam aqui.
Nohillside
3
Por que você precisa manter as pastas separadas? Para mim, parece mais fácil ter uma pasta com os arquivos (portanto, seus conflitos de nome são tratados quando os arquivos são criados / reunidos) e, em seguida, copiar um link simbólico para uma das outras duas pastas organizacionais. Se houver uma maneira fácil de saber onde eles pertencem por meio de um script, isso pode ser feito com uma Ação de Pasta.
ghoppe
Meu amigo e eu mantemos uma pasta de anotações em texto simples. Quero incluir suas anotações na minha pasta, mas minhas anotações não lhe interessam. Portanto, quero as duas anotações na minha pasta sem colocá-las na pasta.
Stuart Woodward

Respostas:

7

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:

Um "daemon" é, por definição, um serviço em todo o sistema, do qual existe uma instância para todos os clientes. Um "agente" é um serviço que é executado por usuário. Os daemons não devem tentar exibir a interface do usuário ou interagir diretamente com a sessão de logon do usuário. Todo e qualquer trabalho que envolva interação com um usuário deve ser realizado por meio de agentes.

Em http://developer.apple.com/library/mac/#technotes/tn2083/_index.html :

Daemons e agentes, conhecidos coletivamente como programas em segundo plano, são programas que operam sem nenhuma interface gráfica do usuário. Como desenvolvedor, você pode usar programas em segundo plano para executar ações sem a interação do usuário e também para gerenciar um estado compartilhado entre vários outros programas.

A diferença entre um agente e um daemon é que um agente pode exibir a GUI, se desejar, enquanto um daemon não pode. A diferença entre um agente e um aplicativo regular é que um agente normalmente não exibe GUI (ou uma GUI muito limitada).

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:

/tmp/folderstuart
/tmp/folderstuartsfriend

e esta é a pasta comum para o aplicativo:

/tmp/folder

Queremos monitorar os dois caminhos acima e sincronizar seu conteúdo com /tmp/folder.

Esta é a lista que faz o que precisamos:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>notesfoldersync</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/rsync</string>
        <string>-aE</string>
        <string>--delete</string>
        <string>--exclude='.*'</string>
        <string>/tmp/folderstuart/</string>
        <string>/tmp/folderstuartsfriend/</string>
        <string>/tmp/folder</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/tmp/folderstuart</string>
        <string>/tmp/folderstuartsfriend</string>
    </array>
    <key>ThrottleInterval</key>
        <integer>10</integer>
</dict>
</plist>

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 rsyncpara sincronizar pastas. A opção --deletegarante que os arquivos excluídos nas pastas monitoradas também sejam excluídos /tmp/folder. Outras opções são -aEpara copiar padrão e estendido atributos HFS +, e --exclude='.*'saltar .localized, .DS_Storee outros arquivos ocultos.

Eu adicionei ThrottleIntervalcaso 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 launchduma lista de caminhos possíveis) como:

 /System/Library/LaunchDaemons/notesfoldersync.plist

Crio:

/tmp/folderstuart
/tmp/folderstuartsfriend
/tmp/folder

e carregue (ou seja, habilite) o plist:

sudo launchctl load /System/Library/LaunchDaemons/notesfoldersync.plist

Agora crie um arquivo em /tmp/folderstuart:

touch /tmp/folderstuart/file.txt

e veja a mágica acontecer: file.txtserá 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 rsyncpor 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:

sudo launchctl unload /System/Library/LaunchDaemons/notesfoldersync.plist

Quando terminar, carregue-o novamente.

jaume
fonte
O prazer é meu, fico feliz por poder ajudar.
jaume
@Stuart, embora essa resposta seja realmente impressionante, ela tem várias limitações, por isso não deixe de conviver com elas. Em particular, a pasta de arquivos combinada /tmp/folderprecisa 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 .txtarquivos de ambas as pastas. Isso funcionaria para o seu aplicativo?
Old Pro
1

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?

terrydev
fonte