Próbując odpowiedzieć na this question, zdziwiło mnie, że próba utworzenia nowego pliku, gdy ten plik już istnieje, nie generuje unikalnego typu wyjątku, ale po prostu wyrzuca ogólny IOException
.Kody wyjątków lub wykrywanie wyjątku typu "plik już istnieje"
Po tym wszystkim zastanawiałem się, jak ustalić, czy IOException
jest wynikiem istniejącego pliku lub innego błędu we/wy.
Wyjątek ma HResult, ale ta właściwość jest chroniona, a zatem niedostępna dla mnie.
Jedyny inny sposób, jaki widzę, to wzór pasujący do ciągu wiadomości, który wydaje się okropny.
przykład:
try
{
using (var stream = new FileStream("C:\\Test.txt", FileMode.CreateNew))
using (var writer = new StreamWriter(stream))
{
//write file
}
}
catch (IOException e)
{
//how do I know this is because a file exists?
}
Dlaczego nie można po prostu sprawdzić, czy plik istnieje? POCAŁUNEK. –
Ponieważ system plików jest z natury niestabilny. Pliki można tworzyć w dowolnym momencie (nie tylko przeze mnie). – GazTheDestroyer
Przesyłanie wielu błędów do jednego wyjątku bez możliwości ich rozróżnienia jest prawdopodobnie najgorszą cechą projektu .NET Framework. Masz taki sam problem z dyskiem pełnym, nie znaleziono ścieżki sieciowej itp. Wyjątki. Nawet jeśli dostaniesz kod HResult, jeśli twój kod musi działać również pod Mono w Linuksie, to nie jest to obsługiwane. – jimvfr