Pergunta

Eu quero criar e abrir um arquivo, mas apenas se ele não existir. Eu não quero usar um File.Exists porque um segmento pelo interruptor depois de criar um arquivo com o mesmo nome.

Como posso verificar se a exceção System.IO.IOException foi causado pelo arquivo existente? Eu prefiro não analisar a msg de erro (mesmo tho ele pode ser tão simples como .indexOf ( "existe"))

Como devo fazer isso?

Foi útil?

Solução

Você deve evitar sempre a tomada de decisões lógicas com base no conteúdo da propriedade Exception.Message. Que é definido como sendo uma mensagem legível, não é algo para um programa de ler. Tais mensagens são sujeitas a mudança sem aviso prévio.

mensagens legível muitas vezes mudar para torná-los mais legível para os seres humanos. Isso não vai fazer seu programa mais feliz.


Como você pode ser capaz de dizer, a questão da lógica do programa, dependendo mensagens legíveis é uma aflição da mina - Eu não vou te dizer por quanto tempo, desde que me faz sentir velha. Isso tem me distraído de algo que deveria ter sido óbvio.

Por favor, verifique se você receber um System.IO .FileNotFoundException quando o arquivo não existe. Tente pegar que em vez de IOException.

Outras dicas

Eu não estou certo de que ele quer abrir o arquivo em todos, se ele já existe.

Eu acho que ele é, na verdade depois FileMode.CreateNew este irá lançar uma IOException se o arquivo já existe, mas caso contrário, irá criar e abri-lo.

Você pode sempre verificar File.Exists () ... De dentro do bloco catch exceção. Você não quer verificar antes por causa de enfiar -. Modo a verificar depois que você já sabe que tem um problema

Assumindo que você não está de repente, apagando o arquivo de um segmento diferente esta seria uma maneira fácil e óbvia de fazê-lo.

Não se esqueça que os File.Exists pode-se causar uma exceção por isso não deixe de pegá-lo novamente.

Sua melhor opção aqui é usar a opção CreateNew ao abrir o ficheiro para escrita.

Não é simples nenhuma maneira confiável para verificar a existência de um arquivo no disco. A única coisa que você pode verificar se é ou não um arquivo acostumado e ainda pode existe no disco para que o processo tem pelo menos uma forma limitada de acesso.

Mesmo se você portão todo o acesso a um arquivo do seu aplicativo, você não pode evitar de forma confiável algum outro aplicativo de criar / excluir o arquivo. Mesmo com bloqueios de nível de sistema de arquivos suficientes, os usuários podem fazer coisas nefastos como levar uma chave USB para fora do computador.

A melhor maneira de abordar este tipo de problema é usar as opções abertas, como CreateNew. Isso permitirá que a operação só para ter sucesso se o arquivo não está na existência, no momento da criação é tentada. Você pode capturar a exceção nesse ponto e tentar inferir se fosse a partir do arquivo existente ou alguma outra exceção de acesso inválido.

Métodos como File.Exist dar uma falsa sensação de segurança para sua base de código e devem ser cuidadosamente revisada no check-in.

Você pode usar File.Open e chamá-lo com FileMode.OpenOrCreate .

Per comentário: Ok, que tal FileMode.CreateNew? Então, se houver um já, você vai ter uma IOException, caso contrário, fazer um novo.

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