0

2 つのテキスト ファイルを比較し、違いをログ ファイルに書き込むこのコードがありますが、何らかの理由で、* で始まるいくつかの行でテストした場合でも、log.txt ファイルが空白になることがあります。これらは常に書き込まれるわけではありません。書き終わったらテキストファイルを保存する

private void compare()
{
  string FilePath = @"c:\snapshot\1.txt";
  string Filepath2 = @"c:\snapshot\2.txt";
  int counter = 0;
  string line;
  string line2;

  var dir = "c:\\snapshot\\log.txt";

  using (FileStream fs = File.Create(dir))
  {
    fs.Dispose();
  }

  StreamWriter dest = new StreamWriter(dir);

  if (File.Exists(FilePath) & File.Exists(Filepath2))
  {
    // Read the file and display it line by line.
    using (var file = File.OpenText(FilePath))
    using (var file2 = File.OpenText(Filepath2))
    {
      while (((line = file.ReadLine()) != null & (line2 = file2.ReadLine()) != null))
      {
        if (line.Contains("*"))
        {
          dest.WriteLine(line2);
        }
        else if (!line.Contains(line2))
        {
          dest.WriteLine(line2);
        }
        counter++;
      }
    }
  } 
  dest.Close();
}
4

3 に答える 3

1

StreamReader で close ステートメントを実行すると、バッファに残っているものはすべて書き出されます。何かが足りない場合は、何らかの理由でその行に到達していない可能性があります (つまり、クラッシュします)。また、書き込み中 (つまり、プログラムがまだ実行中) にファイルを見ようとすると、必ずしもすべてが表示されるとは限りません (ファイルが閉じられていないため)。

一般に、StreamReader では using ステートメントを使用することをお勧めします。これにより、常に閉じられるようになります。

于 2012-08-27T13:08:48.347 に答える
0
private void compare()
{
  string FileName1 = @"c:\snapshot\1.txt";
  string FileName2 = @"c:\snapshot\2.txt";
  string FileNameOutput = @"c:\snapshot\log.txt"; //dir ???
  int counter = 0; // um what's this for you aren't using it.

  using (FileStream fso = new FileStream(FileNameOutput, FileMode.Create, FileAccess.Write))
  {
    TextWriter dest = new StreamWriter(fso);
    using(FileStream fs1 = new FileStream(FileName1, FileMode.Open, FileAccess.Read))
    {
      using (FileStream fs2 = new FileStream(FileName2, FileMode.Open, FileAccess.Read))
      {
        TextReader firstFile = new StreamReader(fs1);
        TextReader secondFile = new StreamReader(fs2);
        while (((line1 = firstFile.ReadLine()) != null & (line2 = secondFile.ReadLine()) != null))
        {
          if ((line1.Contains("*") || (!line1.Contains(line2)))
          {
            dest.Write(line2); // Writeline would give you an extra line?
          }
          counter++; // 
        }
      }
    }
  fso.Flush();
}

FileStreamの過負荷をお勧めします。私のやり方でそれを行うと、ストリームを実行しているユーザーが必要なすべての権限を持っていない場合、ストリームをインスタンス化した時点でコードがクラッシュします。これは、意図していることと意図していないことを示すための優れた方法です。

PSあなたは、ケースと文化に敏感なものが含まれていることを知っていますか?

于 2012-08-27T14:14:11.313 に答える
0

比較ロジックを正しく理解しているかどうかはわかりませんが、コード全体から比較を分離している限り、自分のニーズに合わせて調整できます。

    public static void WriteDifferences(string sourcePath, string destinationPath, string differencesPath)
    {
        var sourceLines = File.ReadAllLines(sourcePath).ToList();
        var destinationLines = File.ReadAllLines(destinationPath).ToList();            

        // make lists equal size
        if (sourceLines.Count > destinationLines.Count)
        {
            destinationLines.AddRange(Enumerable.Range(0, sourceLines.Count - destinationLines.Count).Select(x => (string)null));
        } 
        else
        {
            sourceLines.AddRange(Enumerable.Range(0, destinationLines.Count - sourceLines.Count).Select(x => (string)null));
        }

        var differences = sourceLines.Zip(destinationLines, (source, destination) => Compare(source, destination));

        File.WriteAllLines(differencesPath, differences.Where(x => x != null));
    }

    private static string Compare(string source, string destination)
    {
        return !source.Contains(destination) || source.Contains("*") ? destination : null;
    }
于 2012-08-27T13:29:10.363 に答える