只是爲了說明,當你打開一個文件,.OpenRead()
,然後用.OpenWrite()
再次,它是由sharing(或缺乏)引起的,爲什麼你看到的這個行爲,而不是locking。共享規定在當前數據流仍處於打開狀態時允許從同一文件打開的其他數據流允許哪種訪問。
OpenRead
和OpenWrite
是包裝FileStream
constructor的便利方法; OpenRead
創建一個允許讀共享的只讀流,並且OpenWrite
創建一個只寫流,其中否允許共享。您可能會注意到還有另一種稱爲Open
的方法,其中有超載可讓您自己指定access(第二個參數)和共享(第三個參數)。我們可以翻譯OpenRead
和OpenWrite
到Open
,從而...
$read = (get-item c:\temp\a.log).OpenRead()
# The following line throws an exception
$write = (get-item c:\temp\a.log).OpenWrite()
... ...變得
$read = (get-item c:\temp\a.log).Open('Open', 'Read', 'Read') # Same as .OpenRead()
# The following line throws an exception
$write = (get-item c:\temp\a.log).Open('OpenOrCreate', 'Write', 'None') # Same as .OpenWrite()
你寫
無論哪種方式,第三線將無法創建一個直寫只有流,因爲$read
只會允許其他流讀取。防止這種衝突的一種方法是打開第二之前關閉第一流:
$read = (get-item c:\temp\a.log).Open('Open', 'Read', 'Read') # Same as .OpenRead()
try
{
# Use $read...
}
finally
{
$read.Close()
}
# The following line succeeds
$write = (get-item c:\temp\a.log).Open('OpenOrCreate', 'Write', 'None') # Same as .OpenWrite()
try
{
# Use $write...
}
finally
{
$write.Close()
}
如果你真的需要一個只讀和只寫流同時在同一個文件打開,你可以總是傳遞自己的價值觀,以Open
允許這樣的:
$read = (get-item c:\temp\a.log).Open('Open', 'Read', 'ReadWrite')
# The following line succeeds
$write = (get-item c:\temp\a.log).Open('OpenOrCreate', 'Write', 'Read')
注意,共享是雙向的:$read
需要包括在其共享價值Write
使$write
可以Write
訪問權限打開,並$write
需要包括其共享價值爲Read
因爲$read
已經用Read
訪問。
在任何情況下,當您完成使用任何情況下,在任何情況下都可以撥打Close()
任何Stream
。
將其標記爲接受的答案 –