Estou procurando fazer uma "Drop Folder" em uma unidade compartilhada do Windows que seja acessível a todos. Eu gostaria que os arquivos fossem excluídos automaticamente se eles permanecerem na pasta por mais de X dias.
No entanto, parece que todos os métodos que encontrei para fazer isso usam a data da última modificação, a hora do último acesso ou a data de criação de um arquivo.
Estou tentando fazer desta uma pasta que um usuário possa soltar arquivos para compartilhar com alguém. Se alguém copiar ou mover arquivos para aqui, eu gostaria que o relógio começasse a marcar neste momento. No entanto, a data da última modificação e a data de criação de um arquivo não serão atualizadas, a menos que alguém realmente o modifique. O último horário de acesso é atualizado com muita frequência ... parece que apenas a abertura de um diretório no Windows Explorer atualizará o último horário de acesso.
Alguém sabe de uma solução para isso? Estou pensando que catalogar o hash de arquivos diariamente e, em seguida, expirar os arquivos com base em hashes mais antigos que uma determinada data pode ser uma solução ... mas tirar hashes de arquivos pode ser demorado.
Todas as idéias seriam muito apreciadas!
Nota:
Eu já procurei muitas respostas aqui ... procurei no File Server Resource Monitor, scripts de PowerShell, scripts em lote, etc. Eles ainda usam o último horário de acesso, o horário da última modificação ou o tempo de criação ... que, conforme descrito, não atendem às necessidades acima.
tmpwatch
.Respostas:
Usamos uma combinação de um script do PowerShell e uma política. A política especifica que o usuário deve criar uma pasta dentro do compartilhamento Drop_Zone e, em seguida, copiar os arquivos desejados para essa pasta. Quando a pasta chegar aos 7 dias (usando CreationTime), o script do PowerShell a excluirá.
Também adicionei alguns logs ao script do PowerShell para que pudéssemos verificar sua operação e ativamos as cópias de sombra apenas para salvar os completamente ineptos deles mesmos.
Aqui está o script sem todo o material de log.
fonte
Se você puder assumir o NTFS, poderá escrever uma chave (Guid) em um fluxo alternativo do arquivo. Além da data, você pode basicamente armazenar o banco de dados nos arquivos.
Mais informações podem ser encontradas em
http://blogs.technet.com/b/askcore/archive/2013/03/24/alternate-data-streams-in-ntfs.aspx
Basicamente, você pode armazenar conteúdo adicional em um fluxo separado codificado por um nome especial.
fonte
Você pode usar o IO.FileSystemWatcher, que permite "vigiar" uma pasta para novos arquivos criados. Aqui estão as peças que você precisa para fazer isso funcionar.
Essas variáveis configuram o caminho a ser observado e um filtro para ajustar quais arquivos rastrear:
Isso configura os parâmetros para a pasta a ser observada e as ações a serem executadas quando o evento ocorrer. Basicamente, isso redefine o LastWriteTime em cada arquivo conforme está escrito:
O evento pode não ser registrado, se necessário, usando este:
Por fim, você pode executá-lo uma vez por dia para limpar os arquivos antigos:
Isso deve ser tudo o que você precisa ...
fonte
Já faz um tempo, mas eu configurei um método relativamente direto para resolver isso.
Eu tocava em qualquer arquivo adicionado ao diretório suspenso (monitorado por meio de um utilitário de monitoramento de recursos) e definia a data da última modificação para a data adicionada à pasta.
Eu poderia então usar a data da última modificação para limpar todos os arquivos que precisam ser envelhecidos. Isso também tem a vantagem de que, se alguém realmente atualizar o arquivo, redefinirá a contagem regressiva.
fonte
Não há como confiar nas datas de quando um arquivo foi copiado ou movido para uma pasta. O Windows consegue preservá-lo em sistemas de arquivos, unidades, compartilhamentos de rede etc. Você pode conseguir resolver algo com um servidor de arquivos linux ou impedir que as pessoas copiem arquivos diretamente usando FTP ou um sistema de upload baseado na Web.
Se você concorda com as pessoas que não conseguem modificar os arquivos após o upload, você pode ter pastas de upload e acesso separadas e um script que move os arquivos entre elas e as atualiza novamente. Mas parece que você deseja que as pessoas possam modificar os arquivos diretamente.
Portanto, uma solução simples, embora um tanto invasiva, seria mexer com as datas. Eu escreveria dois scripts:
Script de alteração de data por hora
Faça com que um script seja executado uma vez por hora, no seu idioma preferido, que:
No PowerShell, seria algo parecido com isto:
A execução desse script hoje (27 de maio) define a data de modificação de todos os arquivos para 1º de junho de 1994 - exatamente há 356 * 20 dias. Como está alterando apenas arquivos mais recentes que o valor $ before, não tocará nos arquivos que já definiu para o passado.
Script de limpeza
O script de limpeza seria executado todas as noites e:
Não escreverei o script para esta parte - há muitos utilitários que podem lidar com a exclusão de arquivos anteriores a uma data especificada, escolha o que desejar. A parte importante é procurar arquivos com mais de 7300 + X dias, em que X é o número de dias que você deseja mantê-los desde a última modificação.
Vantagens
Isso tem algumas vantagens sobre as outras respostas aqui:
O único problema que vejo é se as pessoas copiam um arquivo modificado pela última vez há 20 anos para a pasta suspensa. Acho que, na maioria dos cenários, é pouco provável que isso seja um problema, mas pode surgir.
fonte
Você pode formalizar a adição de arquivos à caixa suspensa por meio de uma página da Web, que possui um IFRAME de "upload". O usuário pode então "postar" o arquivo, que chama um trabalho PHP / ASP no servidor, que pega o arquivo e o coloca no local do enrugamento. O PHP / ASP pode realizar qualquer número de operações de índice / análise.
fonte
Eu criaria um script que é executado como tarefas agendadas a cada cinco minutos e faz duas coisas.
fonte
Existe um mecanismo existente para marcar arquivos, o bit Archive. Está presente desde os primeiros dias do DOS e está presente no FAT e no NTFS.
Basicamente, cada arquivo terá seu bit de arquivamento definido por padrão. Se você vir um arquivo com o bit de arquivamento na pasta suspensa, (1) limpe esse bit e (2) defina sua data para hoje. Se você vir um arquivo sem esse bit e com uma data <= 7 dias no passado, exclua-o.
Se um usuário gravar no arquivo enquanto estiver na pasta suspensa, seu bit de arquivamento será definido novamente, para que sua vida útil também seja redefinida para 7 dias. Afinal, é um novo arquivo.
Agora você pode usar o FileSystemWatcher com segurança. Qualquer problema que ele tenha (como eventos duplicados, estouro de buffer que perde informações detalhadas) não importa mais, pois as informações relevantes estão todas nos metadados do arquivo.
fonte