Здравствуйте, Аноним, Вы писали:
А>если в этот же момент, когда я пытаюсь сериализировать в файл, его кто-то юзает — вылетает эксепшн. Как проверить корректно (без Try-catch) возможно ли открыть файл для записи? Пробовал так:
А>но всё-равно, эксепшн летит еще на строке создания FileStream
Использование try-catch — стандартный подход в данной ситуации. Мало того, он не только стандартный, но и правильный. Представьте, что вы решили обойтись без try-catch, а используете некий метод
bool CanWriteToFile(fileName) { ... }
и пишете такой код:
if(CanWriteToFile(fileName)) // (1)
{
using(var fileStream = new FileStream(...)) // (2)
{
...
}
}
Проблема в том, что нет никаких гарантий, что после выполнения строки (1) и до выполнения строки (2) файл не будет открыт другим процессом или удален. Так что вы рискуете получить неожиданное (для вас) исключение, надеясь на такой свой код с проверкой.
Так что, повторюсь, обернуть работу с файлом в try-catch — это стандартный и нормальный подход.
Здравствуйте, Аноним, Вы писали:
А>есть след код:
А>…new System.IO.FileStream(ShellFolder.DocumentsFolderSys() + "selectedDevice.bin", …
Надёжнее и понятнее создавать строку пути из различных компонентов посредством
Path.Combine.
есть след код:
using (System.IO.FileStream fileStream = new System.IO.FileStream(ShellFolder.DocumentsFolderSys() + "selectedDevice.bin", System.IO.FileMode.Create))
{
formatter.Serialize(fileStream, MyDevice);
}
если в этот же момент, когда я пытаюсь сериализировать в файл, его кто-то юзает — вылетает эксепшн. Как проверить корректно (без Try-catch) возможно ли открыть файл для записи? Пробовал так:
using (System.IO.FileStream fileStream = new System.IO.FileStream(ShellFolder.DocumentsFolderSys() + "selectedDevice.bin", System.IO.FileMode.Create))
{
if (fileStream.CanRead)
formatter.Serialize(fileStream, MyDevice);
else
MessageBox.Show("file is busy");
}
но всё-равно, эксепшн летит еще на строке создания FileStream
На всякий случай уточню, что не обязательно оборачивать метод в try-catch прямо в месте открытия файла. Если вам нужно вернуть вещи в согласованное состояние в случае ошибки, то можно использовать просто try-finally, а исключение возможно стоит просто отпустить наверх, чтобы вызывающий код на более верхнем уровне сам решил, что делать в случае исключения. В общем зависит от ситуации, обработка исключений это вообще отдельная и обширная тема.