Manipulação de Arquivo C#

Pessoal bom dia!

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?

[code]using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ConsoleApplication2
{
class Arquivo
{
FileInfo file;

    public FileInfo createFile(int voo)
    {
        if (voo == 1)
        {

           this.file = new FileInfo(@"c:/BH_RIO.txt");

            if (File.Exists(file.ToString()))
            {

                return this.file;

            }
            else
            {

                this.file.Create();

                return this.file;

            }

        }
        else if (voo == 2)
        {
            this.file = new FileInfo("c:/BH_SP.txt");

            if (File.Exists(file.ToString()))
            {

                return this.file;

            }
            else
            {

                File.Create(this.file.ToString());
                                    

                return this.file;
            }

        }
        else if (voo == 3)
        {

            this.file = new FileInfo("c:/BH_SALVADOR.txt");

            if (File.Exists(file.ToString()))
            {

                return this.file;

            }
            else
            {

                this.file.Create();

                return this.file;

            }

        }

        return null;

    }

    public void gravaNoArquivo(Passageiro p)
    {

        if (this.file != null && File.Exists(this.file.ToString()))
        {
            
            StreamWriter sw = new StreamWriter(this.file.ToString(), true); // EXCEÇÃO AQUI
            
           
             sw.Write(p.nome + ";" + p.cpf + ";" + p.telefone + ";" + p.endereco + ";" + p.numVoo + ";"
                        + p.numPassagem + ";" + p.numPoltrona + ";" + p.horario + "\n");


            sw.Flush();
            sw.Close();

         }
                        

        }

    }
    
}

[/code]

Estranho que após á exceção se eu fechar o programinha e abrir de novo e tentar gravar funciona.

Acho que você no caso não está abrindo o arquivo.

Tenta assim:


StreamWriter sw = File.CreateText(this.file.ToString()); 

Vi esse exemplo no livro de certificação do C#, não cheguei a testar.

Espero ter ajudado.

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?

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…

O problema é que a o método FileInfo.Create já abre um Stream para o arquivo, que você não fecha hora nenhuma.

como fecho entao?

como fecho entao?[/quote]

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.

como fecho entao?[/quote]

LOL :shock:

como fecho entao?[/quote]

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.[/quote]

Obrigado meu velho.

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!

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?

boa tarde, cara basta vc abrir o arquivo e começar a fazer exatamente oq tu precisa.

segue um exemplo de código

FileStream arquivo;
using(arquivo = File.Open(“caminhoa”,FileMode.Open))
{

      }

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~

exemplo:

[code]private static void Logger(LogType tipo, Exception Ex, string ex, string detalhes)
{
string msg;
if (Ex == null)
msg = ex;
else
msg = Ex.ToString();

  LogType enuTipo = tipo;
  string caminho = HttpContext.Current.ApplicationInstance.Request.PhysicalApplicationPath + enuTipo.ToString() + ".txt";
  if (!File.Exists(caminho))
    File.Create(caminho);
  using (StreamWriter str = new StreamWriter(caminho))
  {
    StringBuilder strbuilder = new StringBuilder(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();
  }
}[/code]

[quote=ghtmatrix]boa tarde, cara basta vc abrir o arquivo e começar a fazer exatamente oq tu precisa.

segue um exemplo de código

FileStream arquivo;
using(arquivo = File.Open(“caminhoa”,FileMode.Open))
{

      }

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~

[/quote]

Nesse exemplo os dados que estavam no arquivo vao apagar? Eu preciso apagar os que estavao e gravar por cima.

cara, da um molhada na classe
FileStream

você irá encontrar as especificações, de um molhada em .seek

Resolvi aqui, em Java sei que nao da rsrs, segui o mesmo caminho no C# entao deleto o arquivo e crio um novo :lol:

eh uma solução, basta por o inicio dao ponteiro da gravação no começo do arquivo, q resolve hehe

bem mas eh isso ai fuiz…