合并多个文本文件 - StreamWriter不写一个文件?

时间:2014-01-30 13:59:53

标签: c# streamreader streamwriter

我只想合并给定目录中的所有文本文件,类似于以下命令提示符命令:

cd $directory
copy * result.txt

我写了下面的代码,几乎完成了我想要的东西,但是它做了一些奇怪的事情。当StreamWriter写入第一个文件(或i = 0)时,它实际上并不写任何内容 - 文件大小保持为0字节,尽管第一个文件大约为300 KB。但是,其他文件写入成功执行。

如果我将命令提示符的输出与diff中C#代码的输出进行比较,则可以看到缺少大块文本。此外,命令提示符结果为1,044 KB,其中C#结果为700 KB。

string[] txtFiles = Directory.GetFiles(filepath);
using (StreamWriter writer = new StreamWriter(filepath + "result.txt"))
{
    for (int i = 0; i < txtFiles.Length; i++)
    {
       using (StreamReader reader = File.OpenText(txtFiles[i]))
       {
           writer.Write(reader.ReadToEnd());
       }
     }
}

我是否错误地使用了StreamWriter / StreamReader

3 个答案:

答案 0 :(得分:1)

在这里,希望它可以帮到你。注意:通过从流复制到另一个流,您可以节省一些内存并大大提高性能。

class Program
{
    static void Main(string[] args)
    {
        string filePath = @"C:\Users\FunkyName\Desktop";
        string[] txtFiles = Directory.GetFiles(filePath, "*.txt");

        using (Stream stream = File.Open(Path.Combine(filePath, "result.txt"), FileMode.OpenOrCreate))
        {
            for (int i = 0; i < txtFiles.Length; i++)
            {
                string fileName = txtFiles[i];
                try
                {
                    using (Stream fileStream = File.Open(fileName, FileMode.Open, FileAccess.Read))
                    {
                        fileStream.CopyTo(stream);
                    }
                }
                catch (IOException e)
                {
                    // Handle file open exception
                }
            }
        }
    }
}

答案 1 :(得分:1)

简单实现,读取字节并写入它们而不是使用流进行读取 - 请注意,您应该正确处理IOException以避免错误行为:

var newline = Encoding.ASCII.GetBytes(Environment.NewLine);
var files = Directory.GetFiles(filepath);
try
{
    using (var writer = File.Open(Path.Combine(filepath, "result.txt"), FileMode.Create))
        foreach (var text in files.Select(File.ReadAllBytes))
        {
            writer.Write(text, 0, text.Length);
            writer.Write(newline, 0, newline.Length);
        }
}
catch (IOException)
{
    // File might be used by different process or you have insufficient permissions
}

答案 2 :(得分:0)

我写了你的代码,它运作正常!只更改一行:

using (StreamWriter writer = new StreamWriter(filepath + "result.txt"))

为:

using (StreamWriter writer = new StreamWriter(filepath + "/result.txt")) 

我猜您无法看到该文件,因为它已保存在另一个文件夹中。