![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Есть лог-файл, где происходит запись после запуска exe-файла новым пользователем - в конец каждой строки прописывается имя компьютера с которого была запущена программа:
Код: #1 comp1 comp2 comp3... #2 comp1 comp2 comp3 ... #3 comp1 comp2 comp3 ... Как сделать, чтобы в конец каждой строки прописывалось новое имя, при этом происходила проверка на "новизну" имени? |
#2
|
|||
|
|||
![]() Ну, просканируйте перед записью строку на предмет вхождения в нее подстроки с именем «текущего» компьютера (с помощью функции Pos). Или в чем проблема?
|
#3
|
|||
|
|||
![]() Цитата:
Логичнее сделать так: проверка по первой строке, если есть то выходим, если нет - добавляем в конец каждой строки. Т.е., первая строка является трафаретом для других строк, где все идентично первой. Вот только как реализовать на деле? |
#4
|
|||
|
|||
![]() Код:
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
|
|||
|
|||
![]() А как можно заменить:
Код:
const COMPNAME = 'comp5'; |
#6
|
|||
|
|||
![]() Код:
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; Последний раз редактировалось Nyctos Kasignete, 23.07.2009 в 10:27. |
#7
|
|||
|
|||
![]() Переделал вот так:
Код:
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
|
|||
|
|||
![]() На мой взгляд, много ненужных манипуляций с функцией Copy, но не в том дело...
Вот что это: Цитата:
P.S. Да и к тому же имейте в виду, что функция Pos никогда не возвращает отрицательного значения. Цитата:
Последний раз редактировалось Nyctos Kasignete, 24.07.2009 в 14:05. |
#9
|
|||
|
|||
![]() Вот, переделал. Заработало!
Код:
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, благодарю за помощь! |