2016-01-18 2 views
0

Я хочу найти и заменить определенную строку в нескольких файлах. Некоторые из этих файлов могут быть относительно большими, поэтому я использую класс StreamReader из пространства имен System.IO.Используйте StreamWriter() для записи в тот же файл, что и StreamReader()

Проблема заключается в том, что я не хочу писать новые значения в новый файл (это то, что у меня есть в настоящее время). Я хочу просто «обновить» текущие файлы.

$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." 

Кто-нибудь знает, как я могу это сделать?

ответ

4

Вы не можете читать и писать из/в один и тот же файл одновременно. Не с StreamReader и StreamWriter, ни с любым другим обычным методом. Если вам нужно изменить существующий файл и не можете (или не хотите) читать весь его контент в памяти, вы должны должен записать измененный контент во временный файл, а затем заменить оригинал временным файлом после обоих файлов были закрыты.

Пример:

$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 
+0

Хорошо, что это то, что я ожидал, но хотел быть уверен. Спасибо, что помогли Ансгару. – ricky89

Смежные вопросы