Manipulação de Arquivo - [Resolvido]

8 respostas
nel

Bom dia a todos.

Estou com um pequeno problema que ocorre em determinados momentos.
Tenho um Timer que efetua a leitura de um diretório pré-configurado, ou seja, a cada x segundos ele faz uma leitura em busca de arquivos XML para processamento.

O que está ocorrendo, é simples de entender mas não encontrei uma solução para sanar o problema.
Imagina a seguinte situação, quando o sistema vai efetuar a leitura do arquivo XML do diretório, ele ainda está sendo transferido, mesmo assim, ele “captura” este arquivo e envia para processamento, como ainda faltam tags, valores e etc no arquivo gera erro no processamento.

Sendo mais claro, vamos supor que o usuário lança um arquivo XML de 20 MB (Sim, são arquivos grandes) mas o arquivo ainda está com 5 MB e o sistema já efetua a leitura do mesmo, ocasionando o erro.

Alguém teria uma solução ou ideia para sanar este problema?

Grato!

Abraços.

Att,

Nel.

8 Respostas

manolimars

uma idéia seria a criação de um método que verifica se o arquivo está legível para uso do seu sistema, caso esteja ele adiciona no sistema.

E

O correto, ao meu ver, é mudar o processo. Opções:

  1. O processo que cria o arquivo deve abri-lo com permissão exclusiva, então o programa que o lê só poderá lê-lo depois que o processo que cria o arquivo fechá-lo.
  2. O processo que cria o arquivo deve criá-lo com nome diferente (por exemplo, em vez de arquivo.xml deve ser arquivo.xml.incompleto), e só no fim do processo, deve renomeá-lo para o nome correto, que é um arquivo que pode ser processado. Como o processo de renomear o arquivo é atômico, então não deve haver problemas.
  3. Uma variação do processo 2) é o processo que cria o arquivo tem de criá-lo em um outro diretório temporário, NO MESMO DISCO E MESMA PARTIÇÂO do disco, e então movê-lo para o diretório final quando a transferência houver terminado. Mover o arquivo de diretório se ambos os diretórios estiverem no mesmo disco e mesma partição é rápido porque é equivalente a renomear o arquivo.

Todos os programas de “file transfer” que eu já vi funcionando com sucesso usavam uma variação da opção 2 ou 3. (Eles preferiam a opção 2, na verdade, porque renomear o arquivo, sendo que ele fica no mesmo diretório, é mais seguro que supor que o cliente irá criar dois diretórios diferentes na mesma partição).

E

Se os arquivos simplesmente foram copiados manualmente (com o Windows Explorer, por exemplo), a opção 3 seria melhor, porque você pode forçar o usuário a copiar o arquivo para um diretório temporário, e a seguir movê-lo para o diretório correto - se ambos os diretórios estiverem no mesmo disco e partição, a movimentação é rápida porque é um “rename” simples.

E

Eu tenho de ressaltar que mover os arquivos entre dois diretórios do mesmo disco pode, às vezes, implicar em cópia física, porque pode ser que os diretórios apontem, por um recurso do Windows (encontrado, por exemplo, em versões “server” do Windows, como o Windows 2000, 2003, ou 2008 ), apontar para discos físicos diferentes.

balrog

problema comum, e nem sempre com alguma solucao elegante, como ja foi mencionado anteriormente, o ideal seria mudar os passos que a copia acontece(caso isso seja possivel), no contrario algumas coisas que podem ser consideradas:

  • existe algum processo que copia o arquivo? se vc sabe o nome do processo/servico, vc pode monitorar o mesmo e apenas continuar quando o processo que faz a copia terminou
  • o OS eh outro aliado seu, se vc tentar fazer qualquer coisa com o arquivo em questao, vc vai tomar excecao na cabeca, o que significa que o mesmo ainda esta sendo usado por algum outro processo, se tomar excecao, aguarde algum tempo e tente novamente ateh que vc tenha sucesso, indicando que o arquivo esta pronto pra proxima fase to seu flow (como falei no inicio, nem todas as saidas sao elegantes)
nel

Agradeço a atenção de ambos.

É, o maior problema de se efetuar uma destas mudanças, em particular, as que o entanglement comentou, é pelo fato de que estes arquivos são gerados pelo sistema do cliente e não pelo o nosso sistema, ou seja, ai entra questões empresarias como por exemplo, eles poderiam entender que estamos fazendo uma critica ao sistema deles e que eles deveriam alterar o modo como o sistema do cliente trabalha com o arquivo, e isso é um grande problema.

Mas não havia pensado deste modo, o que pude compreender, resolveria este problema.
O que está sendo feito atualmente é utilizar o JAXB para unmarshal, nada elegante, mas ele lança exceção pelo fato do XML não estar “completo” e aguarda mais x segundos até uma nova tentativa e assim por diante.

Bom, vou conversar com o pessoal e apresentar estas novas alternativas.

Muito obrigado a todos.

Att,

Nel

E

Uai, explique o que ocorre. “Conversando a gente se entende” - é o que antigamente as pessoas costumavam dizer. Não sei se isso ainda vale hoje em dia :frowning:

nel

Exatamente.

Infelizmente, muitos se preocupam mais em buscar “culpados” a descobrir e solucionar um determinado problema.
Farei isto e dou o tópico como encerrado, caso alguém tenha um solução diferente e queira postar, fique a vontade.

Muito obrigado entanglement.

Abraços.

Att,

Nel

Criado 10 de agosto de 2010
Ultima resposta 10 de ago. de 2010
Respostas 8
Participantes 4