Porque quando eu crio o arquivo e tento gravar algo em seguida da exceção? Falando que o arquivo esta sendo usado por um outro processo? Ao criar o arquivo ele é aberto?
Vi esse exemplo no livro de certificação do C#, não cheguei a testar.
Espero ter ajudado.
evertonsilvagomesjav
Acho que ta abrindo sim, porque depois da exceçao se eu executo novamente e gravado no arquivo.
Esse método que vc me passou tem o apend do arquivo?
luiz.portnoy
Pelo que eu tô lendo aqui no livro, tem um método File.AppendText, que retorna um StreamWriter. Assim, você pode mudar a lógica para CreateFile se ele não existe e AppendFile se já existe…
juliofsn
O problema é que a o método FileInfo.Create já abre um Stream para o arquivo, que você não fecha hora nenhuma.
D
Dota
como fecho entao?
juliofsn
como fecho entao?
O Importante é sempre lembrar de usar o try…catch…finally, colocando dentro do bloco do finally, todos os recursos que precisam ser liberados, independente de ter ocorrido uma exceção ou não, e streams de arquivos devem sempre ser fechados, de preferência só abertos quando forem efetivamente usados.
No exemplo do post, o arquivo poderia muito bem ter sido criado apenas dentro do método gravaNoArquivo. O método createFile não precisa retornar um FileInfo (afinal o arquivo criado já será uma propriedade da classe), mas poderia retornar o FileStream da função Create (que não precisaria ser fechado), então o método gravaNoArquivo não precisaria verificar se o arquivo existe ou não e aproveitaria o stream retornado ao invés de abrir outro, ele só chamaria createFile, e esse se encarregaria de criar o arquivo se ele não existir.
Bom essa é a forma que eu faria. O importante é ter em mente em sempre fechar qualquer Stream que for aberto.
evertonsilvagomesjav
como fecho entao?
LOL :shock:
evertonsilvagomesjav
como fecho entao?
O Importante é sempre lembrar de usar o try…catch…finally, colocando dentro do bloco do finally, todos os recursos que precisam ser liberados, independente de ter ocorrido uma exceção ou não, e streams de arquivos devem sempre ser fechados, de preferência só abertos quando forem efetivamente usados.
No exemplo do post, o arquivo poderia muito bem ter sido criado apenas dentro do método gravaNoArquivo. O método createFile não precisa retornar um FileInfo (afinal o arquivo criado já será uma propriedade da classe), mas poderia retornar o FileStream da função Create (que não precisaria ser fechado), então o método gravaNoArquivo não precisaria verificar se o arquivo existe ou não e aproveitaria o stream retornado ao invés de abrir outro, ele só chamaria createFile, e esse se encarregaria de criar o arquivo se ele não existir.
Bom essa é a forma que eu faria. O importante é ter em mente em sempre fechar qualquer Stream que for aberto.
Obrigado meu velho.
G
ghtmatrix
exato colega, muitas vezes quando vc estámanipulando arquivos , criando, abrindo, editando, e etc o recomendado é vc usar da seguinte forma
using()
{
}
muitas vezes o using server para armazenar o streamreader stream writer wherever, nao sendo necessário fechar.
se vc criar um arquivo dentro do using() ele automaticamente eh morto e eliminado.
S!
evertonsilvagomesjav
Deixa eu pergntar mais uma coisa, eu tenho um arquivo contendo as linhas que eu gravei nele, esse meu arquivo tem o “append” pra poder continuar escrevendo nele.
Se eu quiser sobreescrever todos os dados do arquivo como faço?
G
ghtmatrix
boa tarde, cara basta vc abrir o arquivo e começar a fazer exatamente oq tu precisa.
neste caso o arquivo dentro de using está pronto para vc usar os comando de stream, tanto para reader, como para writer. Oque eu digo agora aqui para ti, procura no msdn as funções e dicas sobre a forma correta de usar stream, tanto para ler como para escrever, que vc encontrará a solução facil, detalhe, maioria das coisas que prestam sempre está em ingles hehe
qualquer coisa grita~
G
ghtmatrix
exemplo:
privatestaticvoidLogger(LogTypetipo,ExceptionEx,stringex,stringdetalhes){
stringmsg;if(Ex==null)msg=ex;elsemsg=Ex.ToString();LogTypeenuTipo=tipo;stringcaminho=HttpContext.Current.ApplicationInstance.Request.PhysicalApplicationPath+enuTipo.ToString()+".txt";if(!File.Exists(caminho))File.Create(caminho);using(StreamWriterstr=newStreamWriter(caminho)){
StringBuilderstrbuilder=newStringBuilder(null);strbuilder.AppendLine("------------------------------------------------------------------------------");strbuilder.AppendLine(DateTime.Now.ToLongDateString()+" às "+DateTime.Now.ToShortTimeString());strbuilder.AppendLine(msg);strbuilder.AppendLine("------------------------------------------------------------------------------");str.Write(strbuilder.ToString());str.Flush();str.Close();}
}
evertonsilvagomesjav
ghtmatrix:
boa tarde, cara basta vc abrir o arquivo e começar a fazer exatamente oq tu precisa.
neste caso o arquivo dentro de using está pronto para vc usar os comando de stream, tanto para reader, como para writer. Oque eu digo agora aqui para ti, procura no msdn as funções e dicas sobre a forma correta de usar stream, tanto para ler como para escrever, que vc encontrará a solução facil, detalhe, maioria das coisas que prestam sempre está em ingles hehe
qualquer coisa grita~
Nesse exemplo os dados que estavam no arquivo vao apagar? Eu preciso apagar os que estavao e gravar por cima.
G
ghtmatrix
cara, da um molhada na classe
FileStream
você irá encontrar as especificações, de um molhada em .seek
evertonsilvagomesjav
Resolvi aqui, em Java sei que nao da rsrs, segui o mesmo caminho no C# entao deleto o arquivo e crio um novo :lol:
G
ghtmatrix
eh uma solução, basta por o inicio dao ponteiro da gravação no começo do arquivo, q resolve hehe