我的Web應用程序從文件系統返回文件。這些文件是動態的,所以我無法知道名稱會有多少。當這個文件不存在時,應用程序從數據庫中創建它。我想避免兩個不同的線程同時重新創建同一個文件,或者一個線程嘗試在其他線程創建它時返回該文件。如何鎖定文件並在寫入時避免讀取
此外,我不想鎖定所有文件通用的元素。因此,我應該在創建文件時鎖定文件。
所以我想鎖定一個文件,直到它的重新創建完成,如果其他線程嘗試訪問它......它將不得不等待文件被解鎖。
我一直在閱讀關於FileStream.Lock,但我必須知道文件的長度,它不會阻止其他線程嘗試讀取文件,所以它不適用於我的特殊情況。
我一直在閱讀關於FileShare.None,但它會拋出一個異常(哪種異常類型?)如果其他線程/進程試圖訪問該文件...所以我應該開發一個「錯誤「,因爲我想避免產生異常...我不喜歡這種方法,儘管也許沒有更好的方法。
與FileShare.None的方法應該是這樣或多或少:
static void Main(string[] args)
{
new Thread(new ThreadStart(WriteFile)).Start();
Thread.Sleep(1000);
new Thread(new ThreadStart(ReadFile)).Start();
Console.ReadKey(true);
}
static void WriteFile()
{
using (FileStream fs = new FileStream("lala.txt", FileMode.Create, FileAccess.Write, FileShare.None))
using (StreamWriter sw = new StreamWriter(fs))
{
Thread.Sleep(3000);
sw.WriteLine("trolololoooooooooo lolololo");
}
}
static void ReadFile()
{
Boolean readed = false;
Int32 maxTries = 5;
while (!readed && maxTries > 0)
{
try
{
Console.WriteLine("Reading...");
using (FileStream fs = new FileStream("lala.txt", FileMode.Open, FileAccess.Read, FileShare.Read))
using (StreamReader sr = new StreamReader(fs))
{
while (!sr.EndOfStream)
Console.WriteLine(sr.ReadToEnd());
}
readed = true;
Console.WriteLine("Readed");
}
catch (IOException)
{
Console.WriteLine("Fail: " + maxTries.ToString());
maxTries--;
Thread.Sleep(1000);
}
}
}
但我不喜歡這樣的事實,我要捕捉異常,多試幾次,等待時間不準確的量: |
它是FileShare.None而不是FileAccess.None(FileAccess定義您的應用程序具有訪問權限,而FileShare用於鎖定文件,如您所願) – jpabluz 2010-04-08 14:04:42
在其他主題上,請記住在您的應用程序被銷燬時解鎖文件,我討厭事後鎖定。 – jpabluz 2010-04-08 14:06:01
我編輯並修復了它,謝謝! – vtortola 2010-04-08 14:15:44