Pergunta

O StreamReader bloqueia um arquivo de texto enquanto ele está lendo.
Posso forçar o StreamReader para o trabalho em um modo "read-only" ou "não bloqueio"?

Minha solução seria copiar o arquivo para um local temporário e lê-lo de lá, mas eu prefiro usar o StreamReader directamente, se possível. Quaisquer suggetions alternativa?

Fundo:
Eu escrevi um pequeno aplicativo para obter algumas estatísticas a partir de um arquivo de log. Este arquivo está sendo constantemente atualizar (várias vezes por segundo) por um programa externo permite chamada AAXXYY.

Revendo a saída sugere que meu aplicativo pode estar bloqueando o arquivo de e prevenir AAXXYY de escrever.

Isto é o que eu estou fazendo

    private void btnGetStats_Click(object sender, EventArgs e)
    {
        int countStarts = 0;
        int countEnds = 0;

        IList<string> sessions = new List<string>();

        using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode))
        {
            while(!stRead.EndOfStream)
            {
                string line = stRead.ReadLine();
                if(line.Contains("Session start"))
                {
                    countStarts++;
                    sessions.Add(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
                }
                if (line.Contains("Session end"))
                {
                    countEnds++;
                    sessions.Remove(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
                }
            }
        }

        txtStarts.Text = countStarts.ToString();
        txtEnds.Text = countEnds.ToString();
        txtDifference.Text = (countStarts - countEnds).ToString();

        listBox1.DataSource = sessions;
    }
Foi útil?

Solução

Você pode passar um FileStream para o StreamReader, e criar o FileStream com o valor FileShare adequada. Por exemplo:

using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (var reader = new StreamReader (file, Encoding.Unicode)) {
}

Outras dicas

Pensei em adicionar um pouco de contexto, StreamReader não bloquear um arquivo para leitura de apenas para escrever whist que está sendo lido. Dê uma olhada no código abaixo da classe StreamReader.

 new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.SequentialScan);

Observe o parâmetro FileAccess.Read padrão levado para MSDN http: //msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

Permite subsequente abertura do arquivo para leitura. Se este sinalizador não for especificado, qualquer pedido para abrir o arquivo para leitura (por este processo ou outro processo) irá falhar até que o arquivo é fechado. No entanto, mesmo se este sinalizador for especificado, permissões adicionais podem ainda ser necessária para acessar o arquivo.

Mais uma vez retirado MSDN para permitir a leitura ea escrita uso FileAccess.READWRITE vez (como sugerido por Jb Evain).

Permite subsequente abertura do arquivo para leitura ou escrita. Se este sinalizador não for especificado, qualquer pedido para abrir o arquivo para leitura ou escrito (por esse processo ou outro processo) irá falhar até que o arquivo está fechado. No entanto, mesmo se este sinalizador for especificado, adicional Permissões ainda pode ser necessária para acessar o arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top