为了一些乐趣我试图使用平面文件数据库来读取一些数据。使用的文件是文本文件和纯文本格式。我确实设计了它,以便存储数据的格式,例如下面的用户记录。
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
答案 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);
}
}
如果性能有问题,您可能希望将当前记录归零,并在文件末尾重写它,从而创建间隙,但确保不必移动任何数据。