Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并多个文本文件-StreamWriter不写入一个文件?_C#_Streamreader_Streamwriter - Fatal编程技术网

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

C# 合并多个文本文件-StreamWriter不写入一个文件?,c#,streamreader,streamwriter,C#,Streamreader,Streamwriter,我只想合并给定目录中的所有文本文件,类似于以下命令提示符命令: cd $directory copy * result.txt 我已经编写了下面的代码,它几乎实现了我想要的,但是它做了一些奇怪的事情。当StreamWriter写入第一个文件时(或当i=0时),它实际上不会写入任何内容-尽管第一个文件约为300 KB,但文件大小仍为0字节。但是,其他文件写入操作将成功执行 如果我将命令提示符的输出与diff中C#代码的输出进行比较,您会发现缺少一大块文本。此外,命令提示结果为1044KB,其中C

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

cd $directory
copy * result.txt
我已经编写了下面的代码,它几乎实现了我想要的,但是它做了一些奇怪的事情。当
StreamWriter
写入第一个文件时(或当
i=0
时),它实际上不会写入任何内容-尽管第一个文件约为300 KB,但文件大小仍为0字节。但是,其他文件写入操作将成功执行

如果我将命令提示符的输出与diff中C#代码的输出进行比较,您会发现缺少一大块文本。此外,命令提示结果为1044KB,其中C#结果为700KB

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());
       }
     }
}
string[]txtFiles=Directory.GetFiles(filepath);
使用(StreamWriter=newstreamwriter(filepath+“result.txt”))
{
对于(int i=0;i

我是否错误地使用了
StreamWriter
/
StreamReader
。注意:通过从一个流复制到另一个流,可以节省一些ram并大大提高性能

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
                }
            }
        }
    }
}
类程序
{
静态void Main(字符串[]参数)
{
字符串文件路径=@“C:\Users\FunkyName\Desktop”;
字符串[]txtFiles=Directory.GetFiles(filePath,*.txt”);
使用(Stream-Stream=File.Open(Path.Combine(filePath,“result.txt”)、FileMode.OpenOrCreate))
{
对于(int i=0;i
最低限度的实现,读取字节并写入它们,而不是使用流进行读取-请注意,您应该正确处理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
}

我写了你的代码,它工作正常!仅更改行:

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


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

FileMode.OpenOrCreate
将在程序再次在同一目录中运行时,再次将所有文件添加到输出文件中。而是使用
FileMode.Create
完全覆盖它,或者使用
FileMode.CreateNew
在异常已经存在时获取异常。@Herdo程序在运行之前删除与
filePath
变量匹配的任何现有文件夹,因此此实现应该可以。非常感谢。
using (StreamWriter writer = new StreamWriter(filepath + "/result.txt"))