2011-02-23 10 views
12

他の方法はありませんが、1つのテキストファイルの内容を別のテキストファイルに追加する方法があります。動き?C#:1つのテキストファイルの* contents *を別のテキストファイルに追加する

私が知っている唯一の方法は、単に大きなファイルの非効率ですリーダライタを使用することです...

ありがとう!

+0

これは唯一の方法ですか? – CarneyCode

+0

@Carn:これは躊躇しない答えですか?または... – CODe

+1

ファイルのブロックを "リンク解除"できず、SOレベルで他のファイルに "リンク"することはできません(ファイル内のポイントがブロック境界にないためです)。あなたは、読んで、書く必要があります。あなたがトランザクション的にそれをやりたければ...まあ...幸運! :-)これはSQLではありません:-)(新しいウィンドウでは技術的に可能です)。あなたが「普通に」したいのであれば、それは約10/20行のコード(おそらくそれ以下) – xanatos

答えて

26

いいえ、これは何もないと思います。

2つのファイルが同じエンコーディングを使用していて、それらが有効であることを確認する必要がない場合は、バイナリファイルとして扱うことができます。

using (Stream input = File.OpenRead("file1.txt")) 
using (Stream output = new FileStream("file2.txt", FileMode.Append, 
             FileAccess.Write, FileShare.None)) 
{ 
    input.CopyTo(output); // Using .NET 4 
} 
File.Delete("file1.txt"); 

file1.txtがバイトオーダーマークが含まれている場合、あなたはfile2.txtの途中でそれを避けるために、この最初飛ばしなければならないことに注意してください。

あなたはハンドオーバーのシームレスを作るためにも、拡張メソッドで... Stream.CopyToの独自の同等のものを書くことができ、.NET 4を使用していない場合:

public static class StreamExtensions 
{ 
    public static void CopyTo(this Stream input, Stream output) 
    { 
     if (input == null) 
     { 
      throw new ArgumentNullException("input"); 
     } 
     if (output == null) 
     { 
      throw new ArgumentNullException("output"); 
     } 
     byte[] buffer = new byte[8192]; 
     int bytesRead; 
     while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      output.Write(buffer, 0, bytesRead); 
     } 
    } 
} 
+0

+1に変更することを除いて、Jonの答えを改善することはできません。なぜなら、{カスケーディング}を考えていないからです。ええと... StyleCopはそれにフラグを立てますか? – xanatos

+0

@Jon:OpenAppendはFileクラスのメソッドではないようですが、偶然OpenWriteを意味しますか?また、CopyToは利用できません。これらのシステムではSystem.IOを使用していますか?助けてくれてありがとう! – CODe

+0

@コード:おっと、電話が鳴ったときにそれを確認していた。修正されます。 'Stream.CopyTo'は.NET 4でのみ使用されています - どのバージョンを使用していますか? –

3

本のcmd.exeバージョンがされます

01 fileone.txt

デルfiletwo.txt型fileone.txtを>>

これを行うシステムシェルを作成することができます。それはかなり効果があるはずです。

+0

fileone.txtを削除するのではなく、 "消去する"だけの場合は、 'type nul> fileone.txt'を使うことができます。 –

6

エラー処理、エンコーディング、および瞬間のための効率性を無視すると、このようなものはおそらく動作します(しかし、私はそれをテストしていないが)

File.AppendAllText("path/to/destination/file", File.ReadAllText("path/to/source/file")); 

次に、あなただけの最初のファイルを削除するか、クリアしなければなりませんこのステップが完了すると

+0

誰かが完全な百科事典をファイルに持っていないことを願っています:-) – xanatos

0

"非効率的"とはどういう意味ですか。ほとんどの場合、Jonの答えで十分でしょう。 しかし、非常に大きなソースファイルが心配なら、Memory-Mapped Filesはあなたの友人になる可能性があります。詳細はthis linkを参照してください。

関連する問題