private Stream GetFileStream(String path) {
return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read);
}
當嘗試和調試時,它看起來好像沒有阻塞該文件。但我不完全確定。此代碼是否阻止文件?
private Stream GetFileStream(String path) {
return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read);
}
當嘗試和調試時,它看起來好像沒有阻塞該文件。但我不完全確定。此代碼是否阻止文件?
根據你想要什麼你可以添加第四個參數File.Open方法。
要使用只讀訪問打開該文件,允許讀取文件的後續打開:
private Stream GetFileStream(String path) {
return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read);
}
這允許讀取和寫入:
private Stream GetFileStream(String path) {
return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
}
這將阻止這種或其他過程:
private Stream GetFileStream(String path) {
return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None);
}
您的代碼的工作方式,它確實阻止文件。
我塊的理解在這種情況下,該文件是,它是在第一次調用使用您GetFileStream()
方法,以及隨後訪問該文件的任何嘗試都將拋出System.IO.IOException
,因爲該文件已在使用中(直至流關閉和處置)。
我不知道你做了什麼測試,但這裏有一個簡單的測試,在哪裏GetFileStream()
第二次調用將拋出一個異常:
class Program
{
static void Main(string[] args)
{
var test = new OpenFileTest("SomeFile.txt");
Console.ReadKey();
}
}
public class OpenFileTest
{
public OpenFileTest(string path)
{
var stream1 = GetFileStream(path);
var stream2 = GetFileStream(path); // throws IOException
}
private Stream GetFileStream(String path)
{
return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read);
}
}
如果你只想得到文件爲只讀和訪問多個次,爲什麼不改變使用File.ReadAllText()
或File.ReadAllLines()
一次讀取文件的方法並將結果存儲在內存中?
private string[] GetFileLines(String path)
{
return !File.Exists(path) ? null : File.ReadAllLines(path);
}
這種方法還保證你不會不小心留下一堆FileStreams打開,需要處置。
如果您不能使用內存和必須返回一個流,這樣一來會使用FileShare.Read
private Stream GetFileStream(String path)
{
return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read);
}
但是請注意,任何時候你調用該方法處理它,調用方法必須處置Stream
對象以防止內存泄漏。
// do stuff with stream;
stream1.Close();
stream1.Dispose();
'但我不完全確定。「爲什麼?只是測試它是否被阻止(*無論是否意味着*)或不是 –
我無法在併發訪問下測試它,就像很少有人同時使用該站點一樣。這就是爲什麼我不確定。 – Ilham
..你可以讓併發用戶讀取同一個文件,他們只是不能同時寫入它... – Dayan