2011-11-23 12 views
8

私はC#でアプリケーションを作っています。そのアプリケーションでは、私は1バイトの配列を持っていて、そのバイト配列データを特定の位置に書きたいと思っています。C#の特定の位置にデータを書き込む方法は?

私は以下のロジックを使用しました。

using(StreamWriter writer=new StreamWriter(@"D:\"+ FileName + ".txt",true)) 
{ 
    writer.WriteLine(Encoding.ASCII.GetString(Data),IndexInFile,Data.Length); 
} 

しかし、私はファイルにデータを書き込んでいるときに、開始から書き込みを開始します。

私の条件は、最初は空のファイルがあり、10000番地からファイルに書き出したいと考えています。助けてください。事前におねがいします。

+0

「System.IO.IOException」としてエラーが発生しています。以前に追加モードで開いたファイルに存在していたデータを上書きすることができません。 at System.IO.FileStream.Seek(Int64オフセット、SeekOrigin起点) ' – Dany

答えて

10

あなたのようにバイナリデータを文字列として書き込まないでください。正しく動作しません。バイナリデータをバイナリデータとして書き込みます。 StreamWriterの代わりにStreamを使用できます。

using (Stream stream = new FileStream(fileName, FileMode.OpenOrCreate)) 
{ 
    stream.Seek(1000, SeekOrigin.Begin); 
    stream.Write(Data, 0, Data.Length); 
} 
+0

私はそれを使用しましたが、System.IO.IOExceptionとしてエラーが発生しています。以前にAppendモードで開いたファイルに存在していたデータを上書きすることができません。 at System.IO.FileStream.Seek(Int64オフセット、SeekOrigin起点) – Dany

+2

次に、 'FileMode.Append'を使用しないでください。 – svick

+0

しかし、私はデータを追加したい。それから私は何をするだろうか? – Dany

1

ちょっとハッキリですが、StreamWriterBaseStreamプロパティにアクセスし、Seek(long offset, SeekOrigin origin)を使用してください。 (ないすべてのストリームがSeekを使用することができますとしてではなく、警告が表示さ。)

3

あなたはこのようなストリーム内の位置を設定することができます。

writer.BaseStream.Seek(1000, SeekOrigin.Begin); 

あなたWriteLineコードの前にこれを追加します。

最初にファイルに1000文字以上の文字が含まれていることを確認するコードはありません。使用している

+0

ファイルが十分に大きくなくても 'Seek()'はうまく動作すると思います。欠けている部分は0バイトで埋められます。 – svick

1

WriteLine過負荷は、このいずれかになります。

TextWriter.WriteLine Method (Char[], Int32, Int32)

特に供給IndexInFile引数は実際にインデックスををしませ読み込みを開始するよう、そこからバッファのインデックスでありますこれは、あなたが期待どおりにIndexInFileにないファイルの先頭に書いている理由を説明しています。

基本ストリームへのアクセス権を取得し、最初にファイル内の希望する位置にSeekを取得してからファイルに書き込む必要があります。

関連する問題