0

我正在使用 StreamWriter 将记录写入文件。现在我想覆盖特定的记录。

string file="c:\\......";
StreamWriter sw = new StreamWriter(new FileStream(file, FileMode.Open, FileAccess.Write));
sw.write(...);
sw.close();

我在这里的某个地方读到我可以使用Stream.Write 方法来做到这一点,我以前没有关于如何处理字节的经验或知识。

 public override void Write(
    byte[] array,
    int offset,
    int count
)

那么如何使用这个方法。我需要有人解释一下这个方法中的字节[]数组和整数计数到底是什么,任何简单的示例代码都显示了如何使用这种方法覆盖文件中的现有记录。

前任。更改任何记录,例如记录 Mark1287,11100,25| 至 Bill9654,22100,30| .

4

2 回答 2

1

如果你想覆盖一个特定的记录,你必须使用FileStream.Seek-method 来设置你的流的位置。

示例Seek

using System;
using System.IO;

class FStream
{
static void Main()
{
    const string fileName = "Test#@@#.dat";

    // Create random data to write to the file.
    byte[] dataArray = new byte[100000];
    new Random().NextBytes(dataArray);

    using(FileStream  
        fileStream = new FileStream(fileName, FileMode.Create))
    {
        // Write the data to the file, byte by byte.
        for(int i = 0; i < dataArray.Length; i++)
        {
            fileStream.WriteByte(dataArray[i]);
        }

        // Set the stream position to the beginning of the file.
        fileStream.Seek(0, SeekOrigin.Begin);

        // Read and verify the data.
        for(int i = 0; i < fileStream.Length; i++)
        {
            if(dataArray[i] != fileStream.ReadByte())
            {
                Console.WriteLine("Error writing data.");
                return;
            }
        }
        Console.WriteLine("The data was written to {0} " +
            "and verified.", fileStream.Name);
    }
}
}

找到位置后,使用Write,而

public override void Write(
byte[] array,
int offset,
int count
)

Parameters
array
Type: System.Byte[]
The buffer containing data to write to the stream.
offset

Type: System.Int32
The zero-based byte offset in array from which to begin copying bytes to the stream.

count
Type: System.Int32
The maximum number of bytes to write.

最重要的是:不确定时始终考虑文档!

于 2013-04-25T10:57:13.207 回答
1

所以......简而言之:

  • 您的文件是基于文本的(但允许基于二进制)。
  • 您的记录有各种大小。

这样,如果不分析您的文件,就无法知道给定记录的开始和结束位置。如果要覆盖一条记录,新记录可能比旧记录大,因此必须移动该文件中更远的所有记录。

这需要一个复杂的管理系统。选项可能是:

  • 当您的应用程序启动时,它会分析您的文件并将每条记录的开始和长度存储在内存中。
  • 有一个单独的(二进制)文件保存每条记录的开始和长度。这将总共花费额外的 8 个字节(开始 + 长度都是 Int32。也许你想考虑 Int64。)

如果你想重写一条记录,你可以使用这个“记录/开始/长度”系统来知道从哪里开始写你的记录。但在你这样做之前,你必须保证空间,从而在记录被重写之后移动所有记录。当然,您必须使用新的职位和长度更新您的管理系统。

另一种选择是作为数据库:每条记录都存在固定宽度的列。即使是文本列也有最大长度。因此,您可以很容易地计算出文件中每条记录的开始位置。例如:如果每条记录的大小为 200 字节,那么记录 #0 将从位置 0 开始,下一条记录从位置 200 开始,之后的一条记录在 400 等。当一条记录移动时,您不必移动记录重写。

另一个建议是:创建一个管理系统,就像管理内存的方式一样。一旦记录被写入,它就会保留在那里。管理系统保留文件的分配部分和空闲部分的列表。如果写入新记录,则管理系统将搜索空闲且合适的部分,并将记录写入该位置(可选地留下较小的空闲部分)。当一条记录被删除时,该空间被释放。当您重写一条记录时,您实际上删除了旧记录并写入一条新记录(可能在完全不同的位置)。

我的最后一个建议:使用数据库:)

于 2013-04-25T12:06:47.420 回答