Pergunta

Tenho uma aplicação onde eu às vezes é preciso ler a partir de arquivo que está sendo escrito para e como resultado está sendo bloqueado. Como eu entendi de outras questões eu deveria pegar o IOException e repetição até que eu possa ler.

Mas a minha pergunta é como eu sei com certeza que o arquivo está bloqueado e que não é outro IOExcetpion que ocorre.

Foi útil?

Solução

Quando você abre um arquivo para leitura em .NET que, em algum momento tentar criar um identificador de arquivo usando o função API CreateFile que define o código de erro que pode ser usado para ver o motivo da falha:

const int ERROR_SHARING_VIOLATION = 32;
try
{
    using (var stream = new FileStream("test.dat", FileMode.Open, FileAccess.Read, FileShare.Read))
    {
    }
}
catch (IOException ex)
{
    if (Marshal.GetLastWin32Error() == ERROR_SHARING_VIOLATION)
    {
        Console.WriteLine("The process cannot access the file because it is being used by another process.");
    }
}

Outras dicas

Há uma discussão útil sobre grupos do Google que você realmente deve ler. Uma das opções é perto de darin de; No entanto, para garantir que você obter o erro win32 direito, você realmente deve chamar o win32 OpenFile () API-se (caso contrário, você realmente não sabe qual erro que você está recuperando).

Outra é analisar a mensagem de erro:. Que falhará se o aplicativo é executado em outra versão de idioma

Uma terceira opção é cortar dentro da classe de exceção com reflexão pescar o HRESULT real.

Nenhuma das alternativas são realmente tão atraente: a hierarquia IOException se beneficiariam de mais algumas subclasses IMHO.

Para ler os dados que você pode fazer:

Usando (fs FileStream = new FileStream (fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete)) {....}

e salvar em arquivo:

Usando (fs FileStream = new FileStream (fileName, FileMode.APPEND, FileAccess.Write, FileShare.Read | FileShare.Delete)) {...}

Bandeiras no final de construtores descreve o que outro processo pode fazer com o arquivo. É bom, é claro, se você controlar tanto escrever e ler ...

Você pode abri-lo (como descrito por bezieur), em seguida, tentar bloquear seções (ou arquivo inteiro): http://www.java2s.com/Code/VB/File- Directório / Lockandunlockafile.htm

Você quer dizer que são ambos leitura e escrita para o arquivo? Ou que uma aplicação externa está escrevendo para ele.

Se você está fazendo a leitura e escrita, então eu suponho que você está fazendo isso de diferentes tópicos, caso em que tomar um olhar para a classe ReaderWriteLock que vai fazer isso a gestão para você, e permitem que você forneça o tempo limite.

http://msdn.microsoft.com/en -us / library / system.threading.readerwriterlock.aspx

Caso contrário, tudo o que você precisa fazer é abrir o arquivo em um modo somente leitura. Então você não deve ter nenhum problema:

fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read));

Você pode comparar com o tipo IOException para verificar e ver se não é outra coisa

como

if (ex is FileNotFoundException)

Você pode querer procurar a ajuda on System.IO. Um monte de exceções em que herdam da classe de IOException . Fora de verificação para ver se é um outro tipo de exceção que você pode ter que olhar na mensagem da descrição ou você pode olhar para fazer uma chamada de API Win32 em shell32.dll. Pode haver uma função lá para verificar se um arquivo está bloqueado.

Além disso, se você absolutamente precisa esperar você pode usar loop, mas se você quer fazer outras ações enquanto espera uso um segmento assíncrono.

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