平面文件数据库的更新
本文关键字:更新 数据库 平面文件 | 更新日期: 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);
}
}
如果性能有问题,您可能希望将当前记录清零,并在文件末尾重写它,从而创建间隙,但确保不必移动任何数据。