как узнать занят ли файл
От: Аноним  
Дата: 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: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: как узнать занят ли файл
От: MozgC США http://nightcoder.livejournal.com
Дата: 03.02.11 01:35
Оценка:
На всякий случай уточню, что не обязательно оборачивать метод в try-catch прямо в месте открытия файла. Если вам нужно вернуть вещи в согласованное состояние в случае ошибки, то можно использовать просто try-finally, а исключение возможно стоит просто отпустить наверх, чтобы вызывающий код на более верхнем уровне сам решил, что делать в случае исключения. В общем зависит от ситуации, обработка исключений это вообще отдельная и обширная тема.
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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.