2013-11-22 271 views
2

我創建了一個程序,其中包含用戶輸入他的信息的登錄系統,程序檢查程序連接到的數據庫以查看結果是否匹配,然後將用戶記入日誌。我想爲每次用戶登錄時創建一個日誌文件。日誌文件的名稱應該包含用戶的用戶名以及用戶登錄的日期和時間。我使用以下代碼檢查用戶的憑據並寫入他的細節到一個日誌文件。此外,我想在文件名中的日期是像2013 1月23日。所以爲的編碼是之前的「與dmPredictGame做......」如何將文本文件保存到特定文件夾

sDate := DateToStr(Date()); 
sTime := TimeToStr(Time()); 

    iYear := StrToInt(Copy(sDate,1,4)); 
    iDay := StrToInt(Copy(sDate,9,2)); 
    K := StrToInt(Copy(sDate,6,2)); 

Case K of 
    1 : sMonth := 'January'; 
    2 : sMonth := 'February'; 
    3 : sMonth := 'March'; 
    4 : sMonth := 'April'; 
    5 : sMonth := 'May'; 
    6 : sMonth := 'June'; 
    7 : sMonth := 'July';      //Check for the  current month 
    8 : sMonth := 'August'; 
    9 : sMonth := 'September'; 
    10 : sMonth := 'Oktober'; 
    11 : sMonth := 'November'; 
    12 : sMonth := 'December'; 
    end; 

    sTime1 := copy(sTime,1,2); 
    sTime2 := copy(sTime,4,2); 
    sLoginTime := sTime1 + ';' + sTime2; //Use ; because windows does not allow : in file names 
    sLoginDate := IntToStr(iDay) + ' ' + sMonth + ' ' + IntToStr(iYear); 


with dmPredictGame do 
    begin 
    if tblUserInfo.Locate('Username', edtUsername.Text, []) AND ((edtPassword.Text) = tblUserInfo['Password']) then   //Check if the username and password is correct. 
    begin 
     MessageDlg('Login was successful! Welcome back ' + edtUsername.Text, mtInformation, [mbOK],0); 
     edtUsername.Text := tblUserInfo['Username']; 
     begin 
     sUsername := edtUsername.Text; 
     sPassword := tblUserInfo['Password']; 
     sName := tblUserInfo['Name']; 
     sSurname := tblUserInfo['Surname']; 
     assignFile(UserLogFile, 'Log ' + sUsername + ' (' + sLoginDate + ') ' + sLoginTime + '.txt'); 
     Rewrite(UserLogFile); 
     writeln(UserLogFile, 'Username: ' + sUsername); 
     writeln(UserLogFile, 'Password: ' + sPassword); 
     writeln(UserLogFile, 'Name: ' + sName); 
     writeln(UserLogFile, 'Surname: ' + sSurname); 
     writeln(UserLogFile, 'Date Logged In: ' + sDate); 
     writeln(UserLogFile, 'Time Logged In: ' + sTime); 
     closeFile(UserLogFile); 
     end; 

現在我的問題:我怎樣才能創建文本文件與程序所在的當前目錄不同的目錄中?我在與程序本身相同的文件夾中有一個名爲「日誌」的文件夾。我希望日誌在創建時保存到該文件夾​​中。

有什麼建議嗎?

+0

@JerryDodge,** **相對路徑。順便說一下,如果CWD設置正確,相對也會起作用。 –

+2

我建議你重新考慮將日誌寫入應用程序文件夾的子目錄。這是可能導致程序不必要求提升權限的事情之一。建議的替代方法是使用Shell API獲取適當的「用戶文檔」或「應用程序數據」文件夾。 –

+0

@克雷格也許這是一個便攜式應用程序,意味着駐留在記憶棒上,這需要它的設置 –

回答

11

首先檢索應用程序的路徑,附加\Log\和文件名,然後提供AssignFile的完整路徑。當然,如果您的應用程序安裝在Windows %ProgramFiles%文件夾中,則它通常不具有對安裝文件夾的寫入訪問權限(以下所有內容都假定您實際上具有對應用程序目錄的寫入訪問權限。 )

var 
    LogFile: string; 
begin 
    // ... other code 
    LogFile := ExtractFilePath(Application.ExeName); 
    LogFile := IncludeTrailingPathDelimiter(LogFile) + 'Logs'; 
    LogFile := IncludeTrailingPathDelimiter(LogFile); 
    LogFile := LogFile + 
      'Log ' + 
      sUserName + 
      ' (' + sLoginDate 
      + ') ' + sLoginTime + '.txt'; 
    AssignFile(UserLogFile, LogFile); 
    // Write to log and other code 
end; 

如果您使用德爾福的更現代的版本,你可以使用的功能在TPath,使這個更容易一些:

uses 
    IOUtils;   // For TPath 

var 
    LogFile: string; 
begin 
    LogFile := TPath.Combine(ExtractFilePath(ParamStr(0)), 'Log'); 
    LogFile := TPath.Combine(LogFile, 
          'Log ' + 
          sUserName + 
         ' (' + sLoginDate 
         + ') ' + sLoginTime + '.txt'; 
    AssignFile(UserLogFile, LogFile); 
end; 

對於文件名部分,我更喜歡使用Format,而不是所有的級聯的:

const 
    LogFileTemplate = 'Log %s(%s)%s.txt'; 

... 
var 
    LogFile: string; 
begin 
    LogFile := TPath.Combine(ExtractFilePath(ParamStr(0)), 'Log'); 
    LogFile := TPath.Combine(LogFile, 
          Format(LogFileTemplate, 
            [sUserName, sLoginDate, sLoginTime])); 
    AssignFile(UserLogFile, LogFile); 
    // Other code 
end; 

爲了解決您的文件命名問題(日期/時間部分),你要它完全錯誤的。 :-)你做得太多了:

var 
    sDate: string; 

    sDate := FormatDateTime('(dd mmmm yyyy) hhmm', Now); 
    // Run now on my system shows (22 November 2013) 1645 
    ShowMessage(sDate); 

這意味着你的文件名被簡化了。與單一sTimeStamp: string;更換sLoginDatesLoginTime,並使用這樣的:

sTimeStamp := FormatDateTime('(dd mmmm yyyy) hhmm', Now); 
LogFile := LogFile + 
      'Log ' + 
      sUserName + 
      sTimeStamp + 
      '.txt'; 
+3

我建議寧願使用ISO日期格式(yyyy-mm-dd),因爲如果文件夾中有大量日誌文件,這將按名稱自然排序。 –

+0

@Glen號工作目錄是工作目錄。XP和Win7一樣,實際上也是在Windows的所有現存版本上。 –

+0

@DavidHeffernan我說過工作目錄嗎?我說GetCurDir() –

相關問題