gpt4 book ai didi

.net - 使用 .net 方法但不使用 powershell cmdlet 的文件

转载 作者:行者123 更新时间:2023-12-02 23:08:28 25 4
gpt4 key购买 nike

要在 powershell 中打开和读取文件,我使用以下两种方法之一:

Get-Content $path

[System.IO.File]::OpenRead($path)

在读取另一个进程正在使用的日志文件时,Get-Content 似乎没有任何问题。然后,与 .NET 方法相比,powershell cmdlet 速度较慢并且使用更多内存。但是,当我尝试使用 .NET 方法时,出现以下错误:

"The process cannot access the file 'XYZ' because it is being used by another process."

问题 1:为什么 .net 方法不能访问文件而 powershell cmdlet 可以?

Q2:如何使用.net方法读取文件?由于 Get-Content 对于大约 80 MB 的日志文件来说太慢了。我通常只读最后一行:

$line = ""
$lineBreak = Get-Date -UFormat "%d.%m.%Y "
$bufferSize = 30
$buffer = New-Object Byte[] $bufferSize
$fs = [System.IO.File]::OpenRead($logCopy)
while (([regex]::Matches($line, $lineBreak)).Count -lt $n) {
$fs.Seek(-($line.Length + $bufferSize), [System.IO.SeekOrigin]::End) | Out-Null
$fs.Read($buffer, 0, $bufferSize) | Out-Null
$line = [System.Text.Encoding]::UTF8.GetString($buffer) + $line
}
$fs.Close()

($line -split $lineBreak) | Select -Last $n
}

Author to original code on StackOverflow

非常感谢任何帮助!

附言!我使用的是 powershell 2.0,无法终止正在使用该文件的进程。此外,我没有对该文件的写入权限,只能读取。

最佳答案

PetSerAl和往常一样,提供了一个简洁的评论,提供了一个有效的解决方案并暗示了一个解释:

要防止 “进程无法访问文件 'XYZ' 因为它正被另一个进程使用。” 错误,您必须使用共享模式打开文件 FileShare.ReadWrite ,以便其他想要写入该文件的进程不会被拒绝访问。

这就是 Get-Content(总是)在幕后所做的事情,这解释了为什么当您使用 时问题不会浮出水面。

相比之下,[System.IO.File]::OpenRead()默认为共享模式 FileShare.Read,这意味着其他进程可以读取但不能写入同一文件。

因此,使用[System.IO.File]::Open()相反,它允许您明确指定共享模式:

$fs = [IO.File]::Open($path, 
[IO.FileMode]::Open,
[IO.FileAccess]::Read,
[IO.FileShare]::ReadWrite)
# ...
$fs.Close()

请注意,我从上面的类型名称中省略了 System. 组件;此组件在 PowerShell 中始终是可选的。

关于.net - 使用 .net 方法但不使用 powershell cmdlet 的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51618294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com