如何使用StreamReader和StreamWriter创建文件副本

本文关键字:创建 文件 副本 StreamWriter 何使用 StreamReader | 更新日期: 2023-09-27 18:06:28

我需要使用StreamReader读取控制台应用程序上的.txt文件,然后创建一个名称不同但内容相同的新文件或备份。问题是我不知道如何使用的内容从第一个文件放置到新的。(这是学校的东西,我是c#新手)

using System;
using System.IO;
namespace UserListCopier
{
    class Program
    {
        static void Main()
        {
            string fineName = "zombieList.txt";
            StreamReader reader = new StreamReader(fineName);
            int lineNumber = 0;
            string line = reader.ReadLine();
            while (line != null) {
                lineNumber++;
                Console.WriteLine("Line {0}: {1}", lineNumber, line);
                line = reader.ReadLine();
            }
            StreamWriter writetext = new StreamWriter("zombieListBackup.txt");
            writetext.Close();
            System.Console.Read();
            reader.Close();
        }
    }
}

如何使用StreamReader和StreamWriter创建文件副本

让我们假设你已经打开了两个流,类似于@jeff的解决方案,但不是ReadToEnd(不是真正有效地蒸汽),你可以缓冲传输。

_bufferSize是一个int类型,设置它为适合你的缓冲区大小(1024,4096或其他)

private void CopyStream(Stream src, Stream dest)
{
    var buffer = new byte[_bufferSize];
    int len;
    while ((len = src.Read(buffer, 0, buffer.Length)) > 0)
    {
        dest.Write(buffer, 0, len);
    }
}

是一个要点,包含一个计算传输速度的类https://gist.github.com/dbones/9298655 file-streamcopy-cs-L36

可以这样做:

using System;
using System.IO;
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var reader = new StreamReader(@"C:'MyOriginalFile.txt"))
            using (var writer = new StreamWriter(@"C:'MyNewFile.txt", append: false))
            {
                writer.Write(reader.ReadToEnd());
            }
            Console.Read();
        }
    }
}

对于磁盘上的文件,您只需要File.Copy(inputPath, outputPath)。我不确定这是否有效地流式传输内容,或者它是否将其全部读入内存,然后一次将其全部写出来。

所以对于大文件,或者如果你有一个流不能解析到磁盘上的路径,你可以有效地从一个复制到另一个,使用以下函数:

private void copyFile(string inputPath, string outputPath)
{
    using (var inputStream = StreamReader(inputPath))
    {
        using (var outputStream = StreamWriter(outputPath))
        {
            copyToOutputStream(inputStream, outputStream);
        }
    }
}
private void copyToOutputStream(StreamReader inputStream, StreamWriter outputStream)
{
    string line = null;
    while ((line = inputStream.ReadLine()) != null)
    {
        outputStream.WriteLine(line);
    }
    outputStream.Write(inputStream.ReadToEnd());
}

该函数从输入流逐行复制到输出流,直到输入流结束。这意味着它一次在内存中只有一行(而不是整个文件),并且它可以在第一个流在/generated中完成读取之前开始向磁盘写入。

回答实际问题:

using var reader = new StreamReader(someInput);
using var writer = new StreamWriter(someOutput);
reader.CopyTo(writer.BaseStream);
public static void ReadFromFile()
{
    using (StreamReader sr = File.OpenText(@"D:'new.txt"))
    {
        string line = null;
        while ((line = sr.ReadLine()) != null)
        {
            using (StreamWriter sw = File.AppendText(@"D:'output.txt"))
            {
                sw.WriteLine(line);
            }
        }
    }
}