如何将文本文件保存到特定文件夹中

时间:2013-11-22 19:56:53

标签: file delphi text

我创建了一个带登录系统的程序,用户输入他的信息,程序检查程序连接的数据库,看看结果是否匹配,然后将用户登录。我想制作一个日志文件每次用户登录时。日志文件的名称应包含用户的用户名以及用户登录的日期和时间。我使用以下代码检查用户的凭据并将其详细信息写入日志文件。此外,我希望文件名中的日期类似于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”的文件夹。我希望在创建日志时将其保存到该文件夹​​。

有什么建议吗?

1 个答案:

答案 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);

这意味着你的文件名被简化了。将sLoginDatesLoginTime替换为一个sTimeStamp: string;,并使用以下内容:

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