如何在c#中的特定位置写入数据?

时间:2011-11-23 13:38:30

标签: c# file

我正在c#中创建一个应用程序。在那个应用程序中,我有一个字节数组,我想将该字节数组数据写入特定位置。

这里我使用了以下逻辑。

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

但无论何时我在文件中写入数据,它都会从开始写入。

我的条件是假设在初始我有空文件,我想从10000位开始写入文件。请帮助我。谢谢。

4 个答案:

答案 0 :(得分:11)

永远不要像你一样尝试将二进制数据写为字符串。它无法正常工作。将二进制数据写为二进制数据。您可以使用Stream代替StreamWriter

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

答案 1 :(得分:3)

您可以像这样设置流中的位置:

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

WriteLine代码之前添加此内容。

请注意,我没有包含任何代码来检查文件中是否至少有1000个字符。

答案 2 :(得分:1)

可能有点hacky,但您可以访问BaseStream的{​​{1}}属性并在其上使用StreamWriter。 (但请注意,因为并非每个流都可以使用Seek(long offset, SeekOrigin origin)。)

答案 3 :(得分:1)

您使用的WriteLine重载就是这个:

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

特别是提供的IndexInFile参数实际上是缓冲区中的索引,从中开始读取而不是文件中开始写入的索引 - 这解释了为什么你在文件的开头写的不是IndexInFile所期望的。

您应首先获取对基础Stream和Seek的访问权限,然后写入文件中的所需位置。