# .NET ja lukitut tiedostot...

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

<!-- category -- mostlylucidcouk, Imported, .NET, FileIO, Exception Handling, Concurrency, Locking -->
OK, voiko kukaan selittää, miksi en voi tarkasti tarkistaa, pystynkö lukitsemaan tiedoston ennen kuin luen sen (toisin sanoen, tarkista, että kukaan muu ei lukitse tiedostoa ennen kuin yritän lukea sitä). Käytän upeaa [TiedostoSystemWatcher](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemiofilesystemwatcherclasstopic.asp) Odotetaan, että tiedostot luodaan hakemistoon ennen työn käynnistämistä - hyvä, mutta ei näytä olevan helppoa tapaa tarkistaa, että tiedosto on "luettava" ennen kuin alkaa lukea... Juuri nyt tapani tehdä tämä tehtävä on yrittää lukea - ja sijoittaa Read-lukko - tiedostoon käyttäen [TiedostoStream](http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemIOFileStreamClassTopic.asp) Ja huomaan virheen, jonka se heittää, kun tiedosto on lukittuna toisella prosessilla...kuten näin...mutta tämä ei todellakaan tunnu oikealta. En pidä ajatuksesta käyttää poikkeuksia (jotka ovat myös todella hitaita) tämänkaltaiseen tehtävään...miksi FileStream ei voi lukea lukkoja ennen tiedoston avaamista???

```
        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;
                }
            }
        }
```