2010-03-19 78 views
1

我有這個代碼,我打開一個流(沒有關閉或配置它),然後我複製流使用的文件,我想我應該得到一個「進程無法訪問文件somefile.xml,因爲它正在使用另一個過程「的例外,但我沒有。任何想法爲什麼?謝謝!代碼:File.Copy打開的流不會崩潰。知道爲什麼?

StreamWriter writer = new StreamWriter("C:\\somefile.xml"); 

writer.Write(string.Empty); 

// I thought this should crash since a stream is using "C:\somefile.xml" 
File.Copy("C:\\somefile.xml", "C:\\copy of somefile.xml", true); 

回答

1

這是因爲的StreamWriter使用FileStream對象,並在其上沒有指定明確的文件共享是FileShare.Read因此FileStream構造器的默認FileShare

允許隨後打開文件供閱讀。如果未指定此標誌,則在文件關閉之前,打開文件進行讀取(通過此進程或其他進程)的任何請求都將失敗。但是,即使指定了此標誌,訪問該文件仍可能需要其他權限。

您可以通過使用允許指定FileShare然後將其傳遞給StreamWriter構造函數的FileStream構造函數來覆蓋該值。

+0

感謝您提供豐富的答案。 – Carlo 2010-03-19 22:19:54

+0

當然可以。 – kervin 2010-03-19 22:24:25

0

我認爲它可以依賴於如何打開源文件。我的意思是如果它共享閱讀。

1

可以鎖定文件以進行編輯或鎖定以進行讀取,或者兩者兼有。你只需要讀取一個文件來複制它,只是打開一個文件不會自動鎖定它來閱讀。如果您閱讀了底層win32 api如何處理文件鎖定,您會更好一些,下面是一個很好的開始的地方:LockFileEx Function