我使用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(第二个参数)并自己共享(第三个参数)。我们可以将OpenReadOpenWrite转换为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/

10-09 02:29