Posso simplesmente ‘ler’ um arquivo que está em uso?

Eu estou tentando usar um StreamReader para ler um arquivo, mas ele está sempre em uso por outro processo, então eu recebo este erro:

O processo não pode acessar o arquivo ‘\ arfjwknasgmed17 \ C $ \ CONDIÇÃO FLAG \ CP-ARFJN-FLAG.XLS’ porque está sendo usado por outro processo.

Existe uma maneira que eu possa ler isso sem copiá-lo? Ou essa é minha única opção?

Você só poderá ler o arquivo se o programa que abriu o arquivo tiver especificado os direitos de compartilhamento de leitura no arquivo.

No entanto, se o arquivo não tiver direitos de compartilhamento de leitura, você não conseguirá copiá-lo em primeiro lugar.

Talvez você não consiga acessar um arquivo se estiver especificando um direito de compartilhamento que entre em conflito com o direito de compartilhamento de um programa que já tenha o arquivo aberto. Por exemplo, você não pode conceder access de gravação se o programa que já o abriu não estiver concedendo access de gravação.

Se o programa que abriu o arquivo em primeiro lugar oferecer suporte ao Volume Shadow Copy (VSS), você também poderá usar o VSS para obter access ao arquivo.

Existem drivers de software comercial que permitem acessar esses arquivos, mesmo quando eles estão em uso. Você costumava ter o Open File Manager da St-Bernards, e também pode usar o File Access Manager (FAM) da VisionWorks Solutions Inc. Esses drivers geralmente são OEMs para fazer backup de empresas de software para inclusão em seus produtos.

O VSS funciona informando ao programa que o arquivo já está aberto e que outro programa gostaria de ler o arquivo. O VSS faz uma cópia do arquivo e permite que você leia essa cópia. O VSS não funciona para aplicativos herdados.

O FAM funciona de maneira transparente para programas legados e não legados, especificando uma “lista permitida” de aplicativos que podem acessar exclusivamente arquivos abertos e bloqueados. Apenas programas nesta lista têm permissão para acessar esses arquivos. Quando um arquivo está sendo aberto, ele entra no modo de cache para que você obtenha uma cópia do arquivo como era quando o ‘backup / aberto’ do arquivo foi iniciado. Neste ponto, o programa que originalmente abriu o arquivo vê o arquivo como está e o segundo programa na lista permitida, vê o arquivo como estava quando o ‘open / backup’ do arquivo aconteceu. Isso garante a consistência do arquivo.

tente o código abaixo.

FileStream fileStr = File.Open(, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); fileStream = new StreamReader(fileStr); 

Eu tentei no Windows XP. Se o arquivo já estiver aberto no modo de gravação por algum outro processo e ele não tiver especificado direitos de compartilhamento, você ainda poderá abrir o arquivo no modo de leitura.

Isenção de responsabilidade: Funciona, mas não sei se você deve usá-la no código de produção. Ainda não consegui encontrar nenhuma documentação formal que diga que deveria funcionar.