# . NET і Заблоковані файли...

<datetime class="hidden">2004-02-20T00:00</datetime>

<!-- category -- mostlylucidcouk, Imported, .NET, FileIO, Exception Handling, Concurrency, Locking -->
Гаразд, будь- хто може пояснити, чому я не можу явно перевірити, чи можу я заблокувати файл перед читанням з нього (тобто, перевірте, чи ніхто інший не блокує файл перед тим, як його прочитати). Я використовую чудовий файл [FileSystemWatcher](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemiofilesystemwatcherclasstopic.asp) зачекати на створення файлів у каталозі перед запуском завдання - добре, але, здається, не є легким способом перевірити, що файл " придатний " до читання, перш ніж починати читання... зараз мій спосіб виконати це завдання - спробувати прочитати - і покласти блок для читання - на файл з використанням команди [FileStream](http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemIOFileStreamClassTopic.asp) і зловити помилку, якщо файл було заблоковано іншим процесом... подібно до цього... але це не так. Я відмовляюся використовувати винятки (які також є дуже повільними) для цього завдання... чому не може FileStram. Чи може програма перевірити, чи немає замків B перед відкриттям файла???

```
        private static int m_ReadAttempts = 0;
        private string  ReadFileFromDisk(string filePath)
        {
            try
            {
                if(!File.Exists(filePath))
                {
                    MessageBox.Show("Sorry, but the file specified " + Environment.NewLine + filePath + Environment.NewLine + "Cannot be found");
                    return string.Empty;
                }
            using(FileStream fs = new FileStream(filePath,FileMode.Open,FileAccess.Read,FileShare.Read))
                {
                        using(StreamReader sr = new StreamReader(fs)) 
                        {
                            string tmpStr = sr.ReadToEnd();
                            sr.Close();
                            m_ReadAttempts =0;
                            return tmpStr;
                        }
                
                }        
            }
            catch(IOException ex)
            {
                    if(m_ReadAttempts < 10)
                {
                    Thread.Sleep(500);
                    m_ReadAttempts++;
                    return ReadFileFromDisk(filePath);
                }
                else
                {
                    throw ex;
                }
            }
        }
```