Обновление базы данных плоских файлов - PullRequest
1 голос
/ 20 февраля 2012

Для развлечения я пытаюсь использовать базы данных плоских файлов для чтения некоторых данных. Используемый файл представляет собой текстовый файл и текстовый формат. Я разработал его так, чтобы был формат хранения данных, например, записи пользователя, как показано ниже.

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

где вышеуказанные данные, если в формате username | password | lastlogin. Я думаю о том, каким образом я могу проверить пользователя, используя имя пользователя, пароль и, если найден, обновить дату последнего входа в систему и сохранить файл без исключения (другие пользователи также будут использовать тот же файл)

Не могли бы вы объяснить с помощью кода, как обновить последнее имя входа в систему при успешном входе в систему и как проверить пароль для имени пользователя.

Я использую 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 Ответ

1 голос
/ 20 февраля 2012

Если с производительностью проблем нет, вам следует перестроить файл, перемещая каждую запись, следующую после записи, которую вы хотите обновить, вверх или вниз, в зависимости от количества байтов, добавленных / удаленных в результате операции обновления.Что-то вроде:

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

Если производительность является проблемой, вы можете обнулить текущую запись и перезаписать ее в конце файла, тем самым создавая пропуски, но гарантируя, что данные не нужно перемещать.1004 *

...