2014-02-19 60 views
-6
private Stream GetFileStream(String path) { 
    return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read); 
} 

當嘗試和調試時,它看起來好像沒有阻塞該文件。但我不完全確定。此代碼是否阻止文件?

+0

'但我不完全確定。「爲什麼?只是測試它是否被阻止(*無論是否意味着*)或不是 –

+0

我無法在併發訪問下測試它,就像很少有人同時使用該站點一樣。這就是爲什麼我不確定。 – Ilham

+0

..你可以讓併發用戶讀取同一個文件,他們只是不能同時寫入它... – Dayan

回答

3

根據你想要什麼你可以添加第四個參數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); 
} 

File.Open Method

+0

如果我的情況只是閱讀,我是否必須更改當前代碼中的任何內容?該文件不會以任何方式更改。我只需要閱讀。 – Ilham

+0

我會在這種情況下添加FileShare.Read。 –

+0

好的。這是合乎邏輯的。謝謝。 – Ilham

2

您的代碼的工作方式,它確實阻止文件。

我塊的理解在這種情況下,該文件是,它是在第一次調用使用您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(); 
+0

然後我需要改變@ Ju9OR提到的代碼? – Ilham

+0

@Ilham:取決於你想要什麼 - 這是做到這一點的一種方式;我在更新的答案中顯示了另一個。 –

+0

由於某些原因,我不能使用內存,如果我解釋它太多的話。只是我不能使用記憶。我所需要做的就是取得文件流,而不是阻止另一個想要取得該文件流的進程的文件。 – Ilham