【问题标题】:How to write data at a particular position in c#?如何在c#中的特定位置写入数据?
【发布时间】:2011-11-23 13:38:29
【问题描述】:

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

这里我使用了以下逻辑。

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

但是每当我在文件中写入数据时,它都会从头开始写入。

我的条件是假设最初我有一个空文件,我想从位置 10000 开始写入文件。请帮助我。提前谢谢。

【问题讨论】:

  • 我收到错误,因为“System.IO.IOException:无法向后搜索以覆盖以前在附加模式下打开的文件中存在的数据。在 System.IO.FileStream.Seek(Int64 offset, SeekOrigin origin)'

标签: c# file


【解决方案1】:

永远不要像你那样尝试将二进制数据写成字符串。它不能正常工作。将二进制数据写入二进制数据。您可以使用 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 偏移量,SeekOrigin 原点)
  • 那就不要使用FileMode.Append
  • 但是我想追加数据。那我该怎么办?
  • 您只能在文件末尾追加。不能在中间追加。
  • 是的,这段代码有效。除了 stream.Seek() 你还可以设置 stream.Position=value。
【解决方案2】:

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

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

在您的 WriteLine 代码之前添加此代码。

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

【讨论】:

  • 我认为 Seek() 即使文件不够大也可以正常工作。它用零字节填充缺失的部分。
【解决方案3】:

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

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

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

您应该首先获得对底层 Stream 和 Seek 文件中所需位置的访问权限,然后再写入文件。

【讨论】:

    【解决方案4】:

    可能有点老套,但您可以访问StreamWriterBaseStream 属性并在其上使用Seek(long offset, SeekOrigin origin)。 (但请注意,并非每个流都可以使用Seek。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 2012-01-21
      • 1970-01-01
      • 2011-08-12
      相关资源
      最近更新 更多