2012-02-20 5 views
1

그냥 재미를 위해서 나는 플랫 파일 데이터베이스를 사용하여 일부 데이터를 읽으려고합니다. 사용되는 파일은 텍스트 파일과 일반 텍스트 형식입니다. 나는 아래와 같이 사용자 레코드와 같은 데이터를 저장하는 형식이 있도록 설계했습니다.플랫 파일 데이터베이스에서 업데이트

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 
+2

일반 텍스트 암호가있는 데이터베이스는 배포하지 마십시오. 저장된 암호가 안전하지 않다는 강력한 통지가있는 경우는 예외입니다. 사용자가 서로 다른 두 트러스트 도메인간에 하나의 암호를 사용해서는 안되지만 모두 암호 만 알면 암호를 일반 텍스트로 복사 할 수 있으므로 공격자가 쉽게 암호를 도용 할 수 있습니다. 이것이 장난감이라면 괜찮습니다. 그러나 모두가 장난감이라는 것을 알고 있는지 확인하십시오. – sarnold

+0

@sarnold 감사합니다. 네, 장난감입니다 :) – Deeptechtons

답변

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

, 당신은 현재 레코드에서 0으로 원하는함으로써 격차를 생성하지만, 데이터가 이동할 수없는 것을 보장 파일의 끝에 그것을 다시 수 있습니다.

+0

여기에 성능 저하는 보이지 않습니다. 스트림은 작업 속도가 가장 빠릅니다. – Deeptechtons

+1

파일의 크기가 메가 바이트 또는 기가 바이트 인 경우에는 다른 이야기가됩니다. 디스크에있는 XXX 메가 바이트의 데이터 이동에는 시간이 걸릴 수 있습니다. – Polity