Page 1 of 1

Запись в файл

Posted: 31.01.2008 23:07
by Edred
Тема восстановлена из кеша гугла. Если автор сможет повторить свой пост (в новой теме) - я этот удалю.
Запись в файл

Edred
Moderator

Joined: 28 Mar 2006
Posts: 654
Location: Saint-Petersburg
Posted: Tue May 01, 2007 1:41 Post subject:

--------------------------------------------------------------------------------

Это полезная вещь, надо ее в инклюды.

Back to top


id
Neophyte



Joined: 24 Dec 2006
Posts: 46

Posted: Fri May 04, 2007 8:59 Post subject:

--------------------------------------------------------------------------------

Вроде Стелс TStringList поддерживает еще.
Тогда еще вариант:
Code:
var
ts: TStringList;
begin
ts:=TStringList.Create();
ts.Text := текст; //или ts.Add(текст) построчно
ts.SaveToFile('путь');
ts.Free;
end;


Back to top


id
Neophyte



Joined: 24 Dec 2006
Posts: 46

Posted: Fri May 04, 2007 9:01 Post subject:

--------------------------------------------------------------------------------

Вспомнил, что в своих некоторых скриптах делал эту возможность и взял оттуда процедуру.
Code:
procedure WriteLog(mes: string);
begin
if not WriteToLog then exit;
with TStringList.Create do
begin
try
LoadFromFile(LogName);
Add(FormatDateTime('dd.mm.yyyy hh:mm:ss > ', Now) + mes);
SaveToFile(LogName);
finally
Free;
end;
end;
end;

WriteToLog - бул.
LogName - стринг.
Из конфига.

Re: Запись в файл

Posted: 04.07.2011 16:39
by Vizit0r
xmind wrote:

Code: Select all

procedure WriteToFile(filepath: string;   data: string); 
... 
изменил на

перезаписать содержимое файла

Code: Select all

procedure WriteToFile(filepath: string; data: string);
var mode: Word;
begin
if FileExists(filepath) then mode := fmOpenReadWrite
else mode := fmCreate;
with TFileStream.Create(filepath,mode) do
  try
    WriteBuffer(data,Length(data)*2);
  finally
    Free;
  end;
end;
добавить строку в файл

Code: Select all

procedure WriteToFile(filepath: string; data: string);
var mode: Word;
begin
if FileExists(filepath) then mode := fmOpenReadWrite
else mode := fmCreate;
with TFileStream.Create(filepath,mode) do
  try
    Seek(0,soFromEnd);
    WriteBuffer(data,Length(data)*2);
  finally
    Free;
  end;
end;
да, можно было это сделать параметром, но я решил не усложнять :)

xmind wrote:пример:
WriteToFile('C:\log.txt', 'hello world' + #13#10);
#13#10 - перевод строки

Re: Запись в файл

Posted: 13.08.2011 0:39
by innominee
Есть вопрос. Юзаю инклюд Визитора, строка кода

Code: Select all

WriteToFile('E:\S\log.txt', 'Started ' +DateTimeToStr(Now)); 
Если дописываю перевод строки после SateTime.., то функция ругается на неверное число параметров. Но даже просто с символом перевода - в файл не дописываются строки, а просто заменяются. Т.е. в файле всегда одна строка =( Т.е. хочу узнать следующее : как использовать вставку времени\ника чара + символ перевода строки, и как сделать, что бы функция дописывала в файл, а не заменяла все в нем? Заранее спасибо за ответ

Re: Запись в файл

Posted: 13.08.2011 0:49
by Vizit0r
копай в сторону Seek(0, soFromEnd);

Re: Запись в файл

Posted: 13.08.2011 1:11
by innominee
Vizit0r wrote:копай в сторону Seek(0, soFromEnd);

Спасибо, помогла вставка строки перед WriteBuffer(data,Length(data));.

Re: Запись в файл

Posted: 13.08.2011 9:37
by Vizit0r
изменил свой пост с функциями

Re: Запись в файл

Posted: 22.11.2013 1:43
by Хреник
пример с добавлением строки в файл, вешает новый стелс 6.1.4 наглухо.

А точнее "Seek(0,soFromEnd);"

Re: Запись в файл

Posted: 22.11.2013 4:38
by Vizit0r
1) Seek исправил, в апдейте будет работать.
2)изменил пример, потому что символы в строке теперь имеют по 2 байта - умножать длину надо на 2.

Re: Запись в файл

Posted: 06.01.2016 20:51
by GeeZeR
Подскажите, как добавить символ разрыва строки в WriteBuffer(data,Length(data)*2); чтобы каждая запись в примере начиналась с новой строки:

Code: Select all

procedure WriteToFile(path: string; data: string);
var mode: Word;
begin
	if FileExists(path) then begin
		mode := fmOpenReadWrite;
	end else begin
		mode := fmCreate;
	end;
	with TFileStream.Create(path,mode) do try
	    Seek(0,soFromEnd);
		WriteBuffer(data,Length(data)*2);
	finally
	    Free;
	end;
end;

Re: Запись в файл

Posted: 06.01.2016 21:31
by Vizit0r
tempstr : String;

tempstr := data + #13 + #10;

Re: Запись в файл

Posted: 07.01.2016 15:33
by GeeZeR
Не хочет так.

Code: Select all

procedure WriteToFile(path: string; data: string);
var mode: Word;
begin
	if FileExists(path) then begin
		mode := fmOpenReadWrite;
	end else begin
		mode := fmCreate;
	end;
	with TFileStream.Create(path,mode) do try
	    Seek(0,soFromEnd);
		WriteBuffer(data + #13 + #10, Length(data)*2);
	finally
	    Free;
	end;
end;
Writeln(data); чёт тоже не пашет.

Re: Запись в файл

Posted: 07.01.2016 23:27
by Vizit0r
ты читал что я писал? Я не писал про "data + #13 + #10". Наверное неспроста я написал про новую переменную, да?
Причем, Length(data)*2 должно быть (Length(data)+2)*2.

Re: Запись в файл

Posted: 08.01.2016 13:38
by GeeZeR
Vizit0r wrote:ты читал что я писал? Я не писал про "data + #13 + #10". Наверное неспроста я написал про новую переменную, да?
Причем, Length(data)*2 должно быть (Length(data)+2)*2.
Растолкуй мне какая разница между:

Code: Select all

WriteBuffer(data + #13 + #10, Length(data)*2);
и

Code: Select all

tempstr := data + #13 + #10;
WriteBuffer(tempstr, Length(data)*2);
?
(Length(data)+2)*2
А про это ты написать забыл, да? :twisted:

Но оно всё равно не пашет, что я делаю не так?

Code: Select all

procedure WriteToFile(path: string; data: string);
var mode: Word;
tempstr : string;
begin
	if FileExists(path) then begin
		mode := fmOpenReadWrite;
	end else begin
		mode := fmCreate;
	end;
	with TFileStream.Create(path,mode) do try
		tempstr := data + #13 + #10;
	   Seek(0, soFromEnd);
		WriteBuffer(tempstr, (Length(data)*2)*2);
	finally
	   Free;
	end;
end;

WriteToFile(<путь>, 'test string');
ImageImage

Re: Запись в файл

Posted: 08.01.2016 14:20
by Vizit0r
НУ ПЛЮС ЖЕ!
(Length(data)+2)

Code: Select all

Program prodaza_runok;

procedure WriteToFile(path: string; data: string);
var mode: Word;
tempstr : string;
begin
   if FileExists(path) then begin
      mode := fmOpenReadWrite;
   end else begin
      mode := fmCreate;
   end;
   with TFileStream.Create(path,mode) do 
   try
      tempstr := data + #13#10;
      Seek(0, soFromEnd);
      WriteBuffer(tempstr,(Length(data)+2)*2);
   finally
      Free;
   end;
end;


begin
WriteToFile('d:\Stealth\my\zzz.txt', 'test string');
end.
итог, в UTF-16

Code: Select all

test string
test string
test string
test string
test string
GeeZeR wrote: Растолкуй мне какая разница между:

Code: Select all

WriteBuffer(data + #13 + #10, Length(data)*2);
и

Code: Select all

tempstr := data + #13 + #10;
WriteBuffer(tempstr, Length(data)*2);
?
WriteBuffer первым параметром принимает переменную неопр. типа. Переменную, а не значение. А data + #13 + #10 это как раз и есть значение.

Кстати - возможно, в результате преоразований скрипт-код это значение и влетает в WriteBuffer как переменная. Впрочем, это уже ньюансы.

Re: Запись в файл

Posted: 08.01.2016 14:59
by GeeZeR
Да, моя невнимательность, спасибо заработало!