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

11

我在使用C#编写一个应用程序。在该应用程序中,我有一个字节数组,并且我想将该字节数组数据写入特定位置。

这里我使用了以下逻辑。

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

但是每当我在写入文件时,它都从起始位置开始写。

我的情况是,假设一开始我有一个空文件,并且我想从文件的第10000个位置开始写入。 请帮忙。谢谢。


我遇到了一个错误,错误信息为“System.IO.IOException: 无法在以追加模式打开的文件中向后定位以覆盖先前存在的数据。 at System.IO.FileStream.Seek(Int64 offset, SeekOrigin origin)” - Dany
4个回答

13

不要像您这样尝试将二进制数据写为字符串。这样做是行不通的。应该将二进制数据写为二进制数据。您可以使用Stream而不是StreamWriter来实现。

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

我使用了这个,但是出现了错误:System.IO.IOException: 无法在以附加模式打开的文件中向后寻找以覆盖先前存在的数据。 在 System.IO.FileStream.Seek(Int64 offset, SeekOrigin origin)。 - Dany
2
那就不要使用 FileMode.Append - svick
但我想要追加数据。那我该怎么做? - Dany
你只能在文件末尾添加,不能在中间添加。 - svick
如果我需要在文件的指定位置添加数据,可能已经存在数据,也可能不存在。那么我该怎么办?请帮帮我。谢谢回复。 - Dany
1
是的,这段代码可以工作。除了使用stream.Seek()之外,您还可以设置stream.Position=value。 - Elmue

3
您可以像这样设置流内的位置:
writer.BaseStream.Seek( 1000, SeekOrigin.Begin);

在你的WriteLine代码之前添加以下内容。
请注意,我没有包含任何代码来检查文件中是否至少有1000个字符可供使用。

我认为即使文件不够大,Seek() 也能正常工作。它会用零字节填充缺失的部分。 - svick

2
您正在使用的WriteLine重载是这个:

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

特别是提供的IndexInFile参数实际上是从缓冲区开始读取的索引,而不是在文件中开始写入的索引 - 这就解释了为什么您在文件开头而不是在IndexInFile处写入。
您应该先访问底层流并使用Seek到所需的位置,然后再写入文件。

1
也许有点巧妙,但您可以访问StreamWriter的BaseStream属性,并在其上使用Seek(long offset,SeekOrigin origin)方法。 (但要注意,并非每个流都可以使用Seek方法。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接