如何在C#或PowerShell中获取由另一个进程打开的文件的实际文件大小?

gcuhipw9  于 2023-05-07  发布在  Shell
关注(0)|答案(1)|浏览(123)

我最近有一个项目需要监控一个文件的增长,以防止文件超过其限制。有一个文件被另一个进程打开。该过程继续向该文件添加内容。我需要监控其文件大小,以确保其文件大小不超过64 GB。由于文件正在打开和写入,Get-ChildItem或[System.IO.FileInfo]无法获取其实际文件大小。此外,如果我在Windows资源管理器中刷新,文件大小将不会更新。我必须右键单击该文件并选择“属性”。然后更新文件大小。
只是想知道我如何得到实际的文件大小,如果文件被打开,并写入其他进程?
多谢了!

lo8azlld

lo8azlld1#

那么,您可以尝试使用System.IO.FileStream类以FileShare.ReadWrite访问权限打开该文件,这允许您读取该文件,即使它当前正在被另一个进程(C#和PowerShell)写入。
<------------------------------------------------------------>
对于C#:

using System.IO;

string filePath = @"C:\path\to\file.txt";
using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    long fileSize = stream.Length;
    // fileSize now contains the actual file size, even if the file is opened and writing by another process
}

<------------------------------------------------------------>
对于PowerShell:

$filePath = "C:\path\to\file.txt"
$fileStream = New-Object System.IO.FileStream($filePath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite)
$fileSize = $fileStream.Length
$fileStream.Close()
# $fileSize now contains the actual file size, even if the file is opened and writing by another process

请记住,在完成文件流后关闭它,以便其他进程可以在必要时访问该文件。也许这就是为什么您必须右键单击文件并选择属性的原因?我不知道。
我希望这能帮上忙…

相关问题