none
Dúvida sobre leitura de arquivo txt. RRS feed

  • 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 ?

    quarta-feira, 17 de abril de 2013 20:02

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
    quinta-feira, 18 de abril de 2013 11:59
  • 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
    quinta-feira, 18 de abril de 2013 13:52

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
    quinta-feira, 18 de abril de 2013 11:59
  • 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
    quinta-feira, 18 de abril de 2013 13:52
  • Obrigado senhores, vou testar a dica....

    t+

    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+

    quarta-feira, 24 de abril de 2013 14:02