我使用PowerShell命令(get-item c:\temp\a.log).OpenRead()
测试文件发生了什么。
打开文件进行读取后,如果发出(get-item c:\temp\a.log).OpenWrite()
,它将返回以下错误
Exception calling "OpenWrite" with "0" argument(s): "The process cannot access the file
'C:\temp\a.log' because it is being used by another process."
+ (get-item c:\temp\a.log).OpenWrite()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : IOException
如何释放
OpenRead()
状态? 最佳答案
只是为了解释为什么当您使用.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
始终是一个好习惯。关于powershell - 如何从锁定状态释放(get-item c:\temp\a.log).OpenRead()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44534455/