我创建了一个带登录系统的程序,用户输入他的信息,程序检查程序连接的数据库,看看结果是否匹配,然后将用户登录。我想制作一个日志文件每次用户登录时。日志文件的名称应包含用户的用户名以及用户登录的日期和时间。我使用以下代码检查用户的凭据并将其详细信息写入日志文件。此外,我希望文件名中的日期类似于2013年1月23日。所以编码就是在“with dmPredictGame do ...”之前。
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;
现在我的问题:如何在与程序所在的当前目录不同的目录中创建文本文件?我在程序本身所在的文件夹中有一个名为“Logs”的文件夹。我希望在创建日志时将其保存到该文件夹。
有什么建议吗?
答案 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;
如果您使用的是更现代的Delphi版本,则可以使用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);
这意味着你的文件名被简化了。将sLoginDate
和sLoginTime
替换为一个sTimeStamp: string;
,并使用以下内容:
sTimeStamp := FormatDateTime('(dd mmmm yyyy) hhmm', Now);
LogFile := LogFile +
'Log ' +
sUserName +
sTimeStamp +
'.txt';