Pergunta

Eu estou escrevendo um aplicativo que monitora um diretório para novos arquivos de entrada por polling O diretório a cada poucos segundos. Novos arquivos podem muitas vezes ser vários megabytes, e assim levar algum tempo para chegar totalmente no diretório de entrada (por exemplo: na cópia de um compartilhamento remoto).

Existe uma maneira simples para detectar se um arquivo está atualmente em processo de ser copiado? Idealmente qualquer método seria plataforma e sistema de arquivos agnóstico, mas falhando que as estratégias específicas podem ser necessárias para diferentes plataformas.

Eu já considerada tomar duas listas do diretório separaetd por alguns segundos e comparar os tamanhos dos arquivos, mas isto introduz um tempo / confiabilidade trade-off que meus superiores não estão satisfeitos com a menos que não há alternativa.

Para o fundo, o aplicativo está sendo escrito como um conjunto de Matlab M-arquivos, por isso não JRE truques / CLR eu tenho medo ...


Editar: arquivos estão chegando na entrada diretamente pelo movimento em linha reta / operação de copiar, quer a partir de uma unidade de rede ou a partir de outro local em um sistema de arquivos local. Esta operação de cópia será provavelmente iniciada por um usuário humano ao invés de outro aplicativo.

Como resultado, é muito difícil colocar qualquer responsabilidade sobre o provedor de arquivo para adicionar arquivos de controle ou usar uma área de estágio intermediário ...


Conclusão: parece que não há nenhuma maneira fácil de fazer isso, então eu resolvida por um cinto-e-chaves aproximar - um arquivo está pronto para o processamento se:

  • seu tamanho não muda em um determinado período de tempo, e
  • é possível abrir o arquivo em modo de somente leitura (alguns processos de cópia colocar um bloqueio no arquivo).

Obrigado a todos por suas respostas!

Foi útil?

Solução

Este é um problema middleware tão antiga quanto as montanhas, ea resposta curta é: Não.

As duas 'soluções' colocar o ônus sobre o arquivo-carregador: (1) fazer o upload do arquivo em um diretório temporário e, em seguida, movê-lo para o diretório de destino (2) fazer o upload do arquivo e, em seguida, criar / upload um 'pronto 'arquivo que indica o estado do arquivo de conteúdo.

A 1ª é a melhor, mas ambos são deselegante. A verdade é que existem melhores meios de comunicação que o sistema de arquivos. Considere o uso de alguns IPC que envolve apenas um impulso ou uma tracção (e não de ambos, como o faz o sistema de arquivos), tais como um POST HTTP, uma fila JMS ou MSMQ, etc. Além disso, esta também pode ser síncrono, permitindo que o processo de receber o ficheiro a reconhecer o conteúdo, mesmo verificar se há merecimento, e entregar ao cliente um recibo - este é o caminho justo para não-repúdio. Siga este, e você nunca vai sofrer argumentos sobre se um arquivo foi ou não foi entregue ao seu servidor para processamento.

M.

Outras dicas

O método mais seguro é ter (s) da aplicação que colocar os arquivos no diretório primeiro colocá-los em um diretório diferente, temporário e, em seguida, movê-los para o real (que deve ser uma operação atômica, mesmo quando usando FTP ou compartilhamentos de arquivos). Você também pode usar convenções de nomenclatura para alcançar o mesmo resultado dentro de um diretório.

Editar: Ela realmente depende do sistema de arquivos, sobre se a sua funcionalidade de cópia ainda tem o conceito de um "arquivo concluída". Eu não sei o protocolo SMB bem, mas se ele tem esse conceito, você poderia escrever um aplicativo que expõe uma interface SMB (ou patch Samba) e uma API para ser notificado para cópias de arquivos concluídos. Provavelmente um monte de trabalho embora.

Um simples possibilidade seria a pesquisa em um bastante grande intervalo (2 a 5 minutos) e apenas reconhecer o novo arquivo a segunda vez que você vê-lo.

Eu não sei de uma maneira em qualquer sistema operacional para determinar se um arquivo ainda está sendo copiado, à excepção talvez de verificar se o arquivo está bloqueado.

Como os arquivos chegar lá? você pode definir um atributo no-los como eles são escritos e, em seguida, alterar o atributo quando gravação está completa? Isto teria de ser feito pela coisa a fazer a escrita ... que parece que não é uma opção.

Caso contrário, cache o listando e tratar um arquivo como novo se ele tem o mesmo tamanho do arquivo para duas listas consecutivas é a melhor maneira que eu posso pensar.

Como alternativa, você poderia usar o tempo modificado no arquivo - o arquivo tem de ser novo e ter um tempo modificado que é pelo menos x no passado. Mas eu acho que isso vai ser sobre equivalente a cache da listagem.

É você é polling da pasta a cada poucos segundos, a sua não muito de uma penalidade de tempo é? E sua agnóstico plataforma.

Além disso, o Linux apenas: http://www.linux.com/feature/144666

Como cron mas para arquivos. Não tenho certeza como ele lida com seu problema específico - mas pode ser de uso

O que é o seu sistema operacional. Em unix você pode usar o "lsof" utilidade para determinar se um usuário tem o arquivo aberto para gravação. Aparentemente, em algum lugar do Windows Processo MS Explorador não é a mesma funcionalidade.

Alternativly você poderia apenas tentar um aberto exclusivo sobre o arquivo e salvar desta falha. Mas isto pode ser um pouco incerto e sua fácil passo em seus próprios pés.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top