Re: как узнать занят ли файл
От: MozgC США http://nightcoder.livejournal.com
Дата: 03.02.11 01:30
Оценка: +4
Здравствуйте, Аноним, Вы писали:

А>если в этот же момент, когда я пытаюсь сериализировать в файл, его кто-то юзает — вылетает эксепшн. Как проверить корректно (без Try-catch) возможно ли открыть файл для записи? Пробовал так:

А>но всё-равно, эксепшн летит еще на строке создания FileStream

Использование try-catch — стандартный подход в данной ситуации. Мало того, он не только стандартный, но и правильный. Представьте, что вы решили обойтись без try-catch, а используете некий метод
bool CanWriteToFile(fileName) { ... }

и пишете такой код:
if(CanWriteToFile(fileName)) // (1)
{
  using(var fileStream = new FileStream(...)) // (2)
  {
     ...
  }
}

Проблема в том, что нет никаких гарантий, что после выполнения строки (1) и до выполнения строки (2) файл не будет открыт другим процессом или удален. Так что вы рискуете получить неожиданное (для вас) исключение, надеясь на такой свой код с проверкой.

Так что, повторюсь, обернуть работу с файлом в try-catch — это стандартный и нормальный подход.
Re: как узнать занят ли файл
От: _FRED_ Черногория
Дата: 03.02.11 08:45
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>есть след код:

А>…new System.IO.FileStream(ShellFolder.DocumentsFolderSys() + "selectedDevice.bin", …


Надёжнее и понятнее создавать строку пути из различных компонентов посредством Path.Combine.
Help will always be given at Hogwarts to those who ask for it.
как узнать занят ли файл
От: Аноним  
Дата: 03.02.11 01:02
Оценка:
есть след код:


            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
Re: как узнать занят ли файл
От: adontz Грузия http://adontz.wordpress.com/
Дата: 03.02.11 01:04
Оценка:
Здравствуйте, Аноним, Вы писали:

Это не возможно сделать на уровне WinAPI (по крайней мере без установки драйвера), так что и в .Net не получится.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: как узнать занят ли файл
От: MozgC США http://nightcoder.livejournal.com
Дата: 03.02.11 01:35
Оценка:
На всякий случай уточню, что не обязательно оборачивать метод в try-catch прямо в месте открытия файла. Если вам нужно вернуть вещи в согласованное состояние в случае ошибки, то можно использовать просто try-finally, а исключение возможно стоит просто отпустить наверх, чтобы вызывающий код на более верхнем уровне сам решил, что делать в случае исключения. В общем зависит от ситуации, обработка исключений это вообще отдельная и обширная тема.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.