Usuário com melhor resposta
Dúvida sobre leitura de arquivo txt.

Pergunta
-
Boas senhores, fiz uma rotina em c# para executar a leitura de um arquivo texto.
Esta feito da seguinte forma:
private bool ValidarArquivo(string fCaminho, string fArquivo, string fFrase) { bool vbRetorno = false; try { System.IO.FileInfo voArquivo = new System.IO.FileInfo(fCaminho + "\\" + fArquivo); if (voArquivo.Exists) { string vsArquivo; using (TextReader linha = new StreamReader(voArquivo.FullName)) { vsArquivo = linha.ReadToEnd(); } if (vsArquivo.Contains(fFrase)) vbRetorno = true; } return vbRetorno; } catch (Exception ex) { string vserro = ex.Message; return true; } }
O codigo rodou blz....
1 - Isto é um boa prática para tratar a leitura de um arquivo?
2 - O arquivo em questão é manipulado por vários sistemas e o meu não pode interferir, portanto minha preocupação é se alguém estiver acessando o arquivo e meu processo travar o arquivo, da forma que eu fiz isso pode acontecer, ou seja, como funciona READTOEND ?
3 - Teria outra forma mais segura ? fazer uma copia do arquivo antes ou readtoend ja é um copy ?
Respostas
-
Vamos lá, na minha opinião:
1 - Não vejo nenhum problema no seu código.
2 - Eu acredito que sim, se duas aplicações tentarem acessar o mesmo arquivo simultaneamente, a segunda a aplicação ira gerar um exception, dizendo que o arquivo já está sendo usado por outro processo.
3 - Você está apenas lendo o arquivo, não acredito que tenha algum problema, desde que o seu código apenas leia os arquivos você corre risco de edita-los ou sei la. Por desencargo de consciência, você pode configurar a permissão do IIS nessa pasta no servidor de apenas leitura.
Ao infinito e além!
- Marcado como Resposta DET1 segunda-feira, 22 de abril de 2013 16:12
-
1 - Isto é um boa prática para tratar a leitura de um arquivo?
R: O código que você utilizou está bom sim...2 - O arquivo em questão é manipulado por vários sistemas e o meu não pode interferir, portanto minha preocupação é se alguém estiver acessando o arquivo e meu processo travar o arquivo, da forma que eu fiz isso pode acontecer, ou seja, como funciona READTOEND ?
R: Para nao dar lock no arquivo, faça como no código abaixo:if (File.Exists(filePath)) { FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); using (TextReader linha = new StreamReader(fs)) { vsArquivo = linha.ReadToEnd(); linha.Close(); } }
Desta forma, é no ReadToEnd, que o conteúdo do arquivo será extraído do disco.
3 - Teria outra forma mais segura ? fazer uma copia do arquivo antes ou readtoend ja é um copy ?
R: Depende do que você quer... O código que eu coloquei acima, vai fazer com que o arquivo não seja travado permitindo que usuários editem este arquivo, e que o ReadToEnd leia o conteúdo do arquivo no DISCO assim que o comando for executado...Abraço
(Se a isto ajudou a resolver o problema, por favor, marque como resposta)
- Marcado como Resposta DET1 segunda-feira, 22 de abril de 2013 16:11
Todas as Respostas
-
Vamos lá, na minha opinião:
1 - Não vejo nenhum problema no seu código.
2 - Eu acredito que sim, se duas aplicações tentarem acessar o mesmo arquivo simultaneamente, a segunda a aplicação ira gerar um exception, dizendo que o arquivo já está sendo usado por outro processo.
3 - Você está apenas lendo o arquivo, não acredito que tenha algum problema, desde que o seu código apenas leia os arquivos você corre risco de edita-los ou sei la. Por desencargo de consciência, você pode configurar a permissão do IIS nessa pasta no servidor de apenas leitura.
Ao infinito e além!
- Marcado como Resposta DET1 segunda-feira, 22 de abril de 2013 16:12
-
1 - Isto é um boa prática para tratar a leitura de um arquivo?
R: O código que você utilizou está bom sim...2 - O arquivo em questão é manipulado por vários sistemas e o meu não pode interferir, portanto minha preocupação é se alguém estiver acessando o arquivo e meu processo travar o arquivo, da forma que eu fiz isso pode acontecer, ou seja, como funciona READTOEND ?
R: Para nao dar lock no arquivo, faça como no código abaixo:if (File.Exists(filePath)) { FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); using (TextReader linha = new StreamReader(fs)) { vsArquivo = linha.ReadToEnd(); linha.Close(); } }
Desta forma, é no ReadToEnd, que o conteúdo do arquivo será extraído do disco.
3 - Teria outra forma mais segura ? fazer uma copia do arquivo antes ou readtoend ja é um copy ?
R: Depende do que você quer... O código que eu coloquei acima, vai fazer com que o arquivo não seja travado permitindo que usuários editem este arquivo, e que o ReadToEnd leia o conteúdo do arquivo no DISCO assim que o comando for executado...Abraço
(Se a isto ajudou a resolver o problema, por favor, marque como resposta)
- Marcado como Resposta DET1 segunda-feira, 22 de abril de 2013 16:11
-
-
Boas senhores....para acompanhamento....
Tive problemas, pois recebi reclamações dos outros consumidores do arquivo.
Tive casos onde o arquivo ficou travado, tive casos onde algumas tasks ficaram travadas...
Fiz teste com o código sugerido...
Não necessariamente o problema foi causado pelo meu código, mas como sou o único mexendo no momento então...td que acontecer..ja sabem....
Vou fazer um teste, fazendo uma copia do arquivo e depois vou consumir a copia....vamos ver o que da....
obrigado
t+