web-dev-qa-db-ja.com

StreamReaderとStreamWriterを使用してファイルのコピーを作成する方法

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();
        }
    }
}
6
claraichu

@jeffのソリューションと同様に、両方のストリームを開いたとしましょう。ただし、ReadToEndの代わりに(実際には効果的にストリーミングされていません)、転送をバッファリングできます。

_bufferSizeは、自分に合ったバッファーサイズ(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);
    }
}

これがGistで、転送速度を計算するクラスが含まれています https://Gist.github.com/dbones/9298655#file-streamcopy-cs-L36

7
dbones

これはそれを行います:

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();
        }
    }
}
4
Jeff Prince

ディスク上のファイルの場合、必要なのは 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());
}

この関数は、入力ストリームが終了するまで、入力ストリームから出力ストリームに一度に1行ずつコピーします。つまり、メモリには(ファイル全体ではなく)一度に1行しかなく、最初のストリームの読み込み/生成が完了する前にディスクへの書き込みを開始できます。

2
Martin Eden
        public static void ReadFromFile()  
        {
            using(StreamReader sr =File.OpenText(@"D:\new.txt"))
            {
                string line=null;
                while ((line=sr.ReadLine())!= null)
                {
                 //   line = sr.ReadLine;
                    using (StreamWriter sw = File.AppendText(@"D:\output.txt"))
                    {
                        sw.WriteLine(line);


                    }
                }
            }
        }
1
Sunny K Saini