阅读&更新文件流

时间:2008-12-04 21:10:51

标签: c# .net filereader filewriter

我有一个小实用程序可以搜索多个文件。我不得不创建它,因为Google和& Windows桌面搜索未找到文件中的相应行。搜索工作正常(我愿意改进)但我想添加到我的util中的一件事是批量查找/替换。

那么如何从文件中读取一行,将其与搜索词进行比较,如果它通过,然后更新该行,并继续浏览文件的其余部分,该怎么办呢?

2 个答案:

答案 0 :(得分:2)

我会为每个文件执行以下操作:

  • 正常搜索。还要检查要替换的令牌。一旦你看到它,再次启动该文件。如果您没有看到要替换的令牌,那么您就完成了。
  • 当您重新开始时,创建一个新文件并复制从输入文件中读取的每一行,然后进行替换。
  • 完成文件后:
    • 将当前文件移至备份文件名
    • 将新文件移至原始文件名
    • 删除备份文件

请注意,不要在二进制文件等上执行此操作 - 进行文本搜索和替换二进制文件的后果通常是可怕的!

答案 1 :(得分:0)

如果PowerShell是一个选项,下面定义的函数可用于执行文件的查找和替换。例如,要在当前目录中的文本文件中查找'a string',您可以执行以下操作:

dir *.txt | FindReplace 'a string'

要将'a string'替换为其他值,只需在最后添加新值:

dir *.txt | FindReplace 'a string' 'replacement string'

您也可以使用FindReplace -path MyFile.txt 'a string'在单个文件中调用它。

function FindReplace( [string]$search, [string]$replace, [string[]]$path ) {
  # Include paths from pipeline input.
  $path += @($input)

  # Find all matches in the specified files.
  $matches = Select-String -path $path -pattern $search -simpleMatch

  # If replacement value was given, perform replacements.
  if( $replace ) {
    # Group matches by file path.
    $matches | group -property Path | % {
      $content = Get-Content $_.Name

      # Replace all matching lines in current file.
      foreach( $match in $_.Group ) {
        $index = $match.LineNumber - 1
        $line = $content[$index]
        $updatedLine = $line -replace $search,$replace
        $content[$index] = $updatedLine

        # Update match with new line value.
        $match | Add-Member NoteProperty UpdatedLine $updatedLine
      }

      # Update file content.
      Set-Content $_.Name $content
    }
  }

  # Return matches.
  $matches
}

请注意,Select-String也支持正则表达式匹配,但为了简单起见,它已被限制为简单匹配;)您还可以执行更健壮的替换,如Jon建议,而不是仅覆盖文件新内容。