平面文件数据库的更新

本文关键字:更新 数据库 平面文件 | 更新日期: 2023-09-27 18:25:04

为了好玩,我尝试使用平面文件数据库来读取一些数据。使用的文件是文本文件和纯文本格式。我确实设计了它,这样就有了存储数据的格式,例如下面这样的用户记录。

stackoverflow | 12345 | 12/12/2012 12:12:12 AM

其中上述数据if的格式为CCD_ 1。我正在考虑如何使用用户名、密码验证用户,如果发现,更新最后登录日期并毫无例外地保存文件(其他用户也将使用相同的文件)

你能用代码解释一下如何在登录成功时更新上次登录数据吗;如何验证用户名密码。

我使用的是C#,.NET 2.0。.

现在psedocode如下所示;

File read DB.txt
      When text not empty
            split text in file with 'n as separator character
            For each item in the output array split using pipe symbol
            check if [0] and [1] index match with username & password supplied
               if matched
                    How to update and save

平面文件数据库的更新

如果性能没有问题,则应根据更新操作添加/删除的字节数,通过向上或向下移动要更新的记录之后的每个记录来重建文件。类似于:

public void UpdateRecordTest()
{
    string changedRecord =
        string.Format("{0}|{1}|{2}", UserName, Password, LoginDate);
    // get a copy of the new records in bytes. This varies based on the encoding
    byte[]changedRecordBytes;
    using(MemoryStream tempStream = new MemoryStream())
        using(StreamWriter tempWriter =
          new StreamWriter(tempStream, Encoding)) {
        tempWriter.WriteLine(changedRecord);
        changedRecordBytes = tempStream.ToArray();
    }
    using(MemoryStream tempStream = new MemoryStream) {
        // save the rest of the file in memory. When the file itself gets too big
        // you want to buffer this in a recursive manner (last part first)
        CurrentStream.CopyTo(tempStream);
        // adjust the position to move to the start of the current record
        CurrentStream.Position -= CurrentRecordBytes.Length;
        // write the temp data
        CurrentStream.WriteTo(changedRecordBytes);
        // copy the rest of the data
        tempStream.CopyTo(CurrentStream);
    }
}

如果性能有问题,您可能希望将当前记录清零,并在文件末尾重写它,从而创建间隙,但确保不必移动任何数据。