更新平面文件数据库

时间:2012-02-20 06:58:16

标签: c# .net database text-files flat-file

为了一些乐趣我试图使用平面文件数据库来读取一些数据。使用的文件是文本文件和纯文本格式。我确实设计了它,以便存储数据的格式,例如下面的用户记录。

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

其中上述数据格式为username | password | lastlogin。我正在考虑使用用户名,密码验证用户的方法是什么,如果发现更新上次登录日期并保存文件而没有例外(其他用户也将使用相同的文件)

你可以用代码解释当登录成功时如何更新上次logindate&如何验证用户名密码。

我正在使用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

1 个答案:

答案 0 :(得分:1)

如果性能没有问题,则应通过移动要更新或关闭的记录之后的每条记录来重建文件,具体取决于更新操作所添加/删除的字节数。类似的东西:

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);
    }
}

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