Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.07.2009, 06:54
SAWaGE SAWaGE вне форума
Прохожий
 
Регистрация: 09.09.2008
Сообщения: 34
Репутация: 10
По умолчанию Добавление в текстовый файл

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

#1 comp1 comp2 comp3...
#2 comp1 comp2 comp3 ...
#3 comp1 comp2 comp3 ...

Как сделать, чтобы в конец каждой строки прописывалось новое имя, при этом происходила проверка на "новизну" имени?
Ответить с цитированием
  #2  
Старый 17.07.2009, 09:33
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Ну, просканируйте перед записью строку на предмет вхождения в нее подстроки с именем «текущего» компьютера (с помощью функции Pos). Или в чем проблема?
Ответить с цитированием
  #3  
Старый 22.07.2009, 08:41
SAWaGE SAWaGE вне форума
Прохожий
 
Регистрация: 09.09.2008
Сообщения: 34
Репутация: 10
По умолчанию

Цитата:
Сообщение от Nyctos Kasignete
Ну, просканируйте перед записью строку на предмет вхождения в нее подстроки с именем «текущего» компьютера (с помощью функции Pos). Или в чем проблема?
Так и есть - необходима проверка строки на присутствие имени.
Логичнее сделать так: проверка по первой строке, если есть то выходим,
если нет - добавляем в конец каждой строки. Т.е., первая строка является трафаретом для других строк, где все идентично первой.
Вот только как реализовать на деле?
Ответить с цитированием
  #4  
Старый 22.07.2009, 13:42
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Код:
const
  COMPNAME = 'comp5'; // например
  FILEPATH = 'comps.txt'; // например
var
  comps: TStringList;
  i: Integer;
  Str: string;
begin
  comps := TStringList.Create;
  try
    if not FileExists(FILEPATH) then Exit;
    comps.LoadFromFile(FILEPATH);
    Str := Copy(comps.Text, 1, Pos(#13#10, comps.Text) + 2);
    if (Pos(' ' + COMPNAME + ' ', str) = 0) and
       (Pos(' ' + COMPNAME + #13, str) = 0) then
    begin
      for i := 0 to comps.Count - 1 do
        comps.Strings[i] := comps.Strings[i] + ' ' + COMPNAME;
      comps.SaveToFile(FILEPATH);
    end;
  finally
    comps.Free;
  end;
end;

Последний раз редактировалось Nyctos Kasignete, 22.07.2009 в 13:52.
Ответить с цитированием
  #5  
Старый 23.07.2009, 08:41
SAWaGE SAWaGE вне форума
Прохожий
 
Регистрация: 09.09.2008
Сообщения: 34
Репутация: 10
По умолчанию

А как можно заменить:
Код:
const
  COMPNAME = 'comp5';
на GetUserName? Т.е., проверку делать не по константе, а по реальному имени машины?
Ответить с цитированием
  #6  
Старый 23.07.2009, 10:24
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Код:
const
  FILEPATH = 'comps.txt'; // например
var
  comps: TStringList;
  i: Integer;
  Str: string;
  username: PChar;
  unsize: DWORD;
begin
  comps := TStringList.Create;
  GetMem(username, 255);
  try
    if not GetUserName(username, unsize) then Exit;
    if not FileExists(FILEPATH) then Exit;
    comps.LoadFromFile(FILEPATH);
    Str := Copy(comps.Text, 1, Pos(#13#10, comps.Text) + 2);
    if (Pos(' ' + StrPas(username) + ' ', str) = 0) and
       (Pos(' ' + StrPas(username) + #13, str) = 0) then
    begin
      for i := 0 to comps.Count - 1 do
        comps.Strings[i] := comps.Strings[i] + ' ' + StrPas(username);
      comps.SaveToFile(FILEPATH);
    end;
  finally
    comps.Free;
    FreeMem(username, 255);
  end;
end;
А как связана функция GetUserName с именем компьютера?

Последний раз редактировалось Nyctos Kasignete, 23.07.2009 в 10:27.
Ответить с цитированием
  #7  
Старый 24.07.2009, 13:45
SAWaGE SAWaGE вне форума
Прохожий
 
Регистрация: 09.09.2008
Сообщения: 34
Репутация: 10
По умолчанию

Переделал вот так:
Код:
implementation

{$R *.dfm}


function GetUserFromWindows: string;
var
  UserName : string;
  UserNameLen : Dword;
begin
  UserNameLen := 255;
  SetLength(userName, UserNameLen);
  if GetUserName(PChar(UserName), UserNameLen) then
    Result := Copy(UserName,1,UserNameLen - 1)
  else
    Result := 'Unknown';
end;

procedure TForm1.AddStrToFile(U: string; const FileName: string; doNextLine: boolean);
const
  CR=#13#10;
var
  f:TFileStream;
begin
  if FileExists(FileName)
  then f:=TFileStream.Create(FileName,fmOpenWrite+fmShareDenyNone)
  else
  begin
    f:=TFileStream.Create(FileName,fmCreate);
  end;

  f.Position:=f.Size;
  if doNextLine and (f.Size> 0)
  then f.Write(CR,2);
  f.Write(pointer(U)^,length(U));
  f.Destroy;
end;

procedure TForm1.FormCreate(Sender: TObject);
const
  FILEPATH = 'log.txt';
var
  str : string;
begin
  str:= Copy(FILEPATH, 1, Pos(#13#10, FILEPATH) + 1);
  if Pos(GetUserFromWindows, FILEPATH) < 0 then
    AddStrToFile(GetUserFromWindows, FILEPATH, true)
  else
    exit;
end;

Но вот в этом месте (в последней процедуре)
Код:
if Pos(GetUserFromWindows, FILEPATH) < 0 then
не могу понять, почему все время равно нулю?
Ответить с цитированием
  #8  
Старый 24.07.2009, 13:56
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

На мой взгляд, много ненужных манипуляций с функцией Copy, но не в том дело...
Вот что это:
Цитата:
Код:
if Pos(GetUserFromWindows, FILEPATH) < 0 then
Зачем вы ищете имя юзера в строке, содержащей имя файла??

P.S. Да и к тому же имейте в виду, что функция Pos никогда не возвращает отрицательного значения.
Цитата:
Сообщение от Delphi Help
If Substr is not found, Pos returns zero.

Последний раз редактировалось Nyctos Kasignete, 24.07.2009 в 14:05.
Ответить с цитированием
  #9  
Старый 24.07.2009, 14:16
SAWaGE SAWaGE вне форума
Прохожий
 
Регистрация: 09.09.2008
Сообщения: 34
Репутация: 10
По умолчанию

Вот, переделал. Заработало!
Код:
const
  FILEPATH = 'log.txt';
var
  logs: TStringList;
  Str : string;
  i: integer;
begin
  logs := TStringList.Create;
  try
    if not FileExists(FILEPATH) then Exit;
    logs.LoadFromFile(FILEPATH);
    Str := Copy(logs.Text, 1, Pos(#13#10, logs.Text) + 2);
    if (Pos(' ' + GetUserFromWindows + ' ', str) = 0) and
       (Pos(' ' + GetUserFromWindows + #13, str) = 0) then
    begin
      for i := 0 to logs.Count - 1 do
        logs.Strings[i] := logs.Strings[i] + ' ' + GetUserFromWindows;
        logs.SaveToFile(FILEPATH);
    end;
  finally
    logs.Free;
  end;
end;

Nyctos Kasignete, благодарю за помощь!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:24.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025