![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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, благодарю за помощь! |