使用StreamWriter()写入与StreamReader()相同的文件

ric*_*y89 2 powershell

我想在许多文件中查找并替换某个字符串.其中一些文件可能比较大,所以我使用的StreamReaderSystem.IO命名空间中的类.

我遇到的问题是我不想将新值写入新文件(这是我目前所拥有的).我想只是"更新"当前文件.

$currentValue = "B";
$newValue = "A";

# Loop through all of the directories and update with new details. 
foreach ($file in $Directories) {
    $streamReader = New-Object System.IO.StreamReader -Arg "$file"
    $streamWriter = [System.IO.StreamWriter] "$file"
    # Switching $streamWriter to the below works.
    # $streamWriter = [System.IO.StreamWriter] "C:\Temp\newFile.txt"

    while($line = $streamReader.ReadLine()){
        # Write-Output "Current line value is $line";
        $s = $line -replace "$currentValue", "$newValue"
        # Write-Output "The new line value is $s"
        $streamWriter.WriteLine($s);
    }

    # Close the streams ready for the next loop.
    $streamReader.close();
    $streamWriter.close();
}

Write-Output "The task has complete."
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么能做上述事情?

Ans*_*ers 6

您无法同时读取/写入同一文件.没有StreamReaderStreamWriter,也没有任何其他通常的方法.如果需要修改现有的文件,并不能(或不愿)读取其全部内容到内存中,你必须修改的内容写入到一个临时文件,然后使用临时文件替换原来的两个文件被关闭后.

例:

$filename = (Get-Item $file).Name

$streamReader = New-Object IO.StreamReader -Arg $file
$streamWriter = [System.IO.StreamWriter] "$file.tmp"

...

$streamReader.Close(); $streamReader.Dispose()
$streamWriter.Close(); $streamWriter.Dispose()

Remove-Item $file -Force
Rename-Item "$file.tmp" -NewName $filename
Run Code Online (Sandbox Code Playgroud)