Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание/изменение файла [D7, WinXP]


SeZuka ©   (2004-12-06 08:22:00) 

Люди добрые подскажите! Мне нужно периодически записывать в конец файла текст, и если такого файла нет, он должен создаваться. Текст примерно такой:

var
 FS: TFileStream;
 s, s1: string;
begin
...
 FS := TFileStream.Create(s, fmCreate); // Открываем файл
 try
   FS.Seek(0, soFromEnd); // Переходим в конец файла
   FS.Write(PChar(s1)^, Length(s1)); // Пишем текст
 finally
   FS.Free; // Закрываем файл
 end;
...

Проблема в том, что файл каждый раз создается заново, хотя везде в хелпе черным по белому написано:
fmCreate Create a file with the given name. If a file with the given name exists, open the file in write mode.
т.е. создается файл с указаным именем и если такой уже существует, то открывает его для записи.
В чем дело, где собака закопана???


SeZuka   (2004-12-06 09:19:00) [1]

2 Fay ©   (06.12.04 09:06) [5]
Действительно! :)
Вот его конструктор:

constructor TFileStream.Create(const FileName: string; Mode: Word; Rights: Cardinal);
begin
 if Mode = fmCreate then
 begin
   inherited Create(FileCreate(FileName, Rights));
   if FHandle < 0 then
     raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
 end
 else
 begin
   inherited Create(FileOpen(FileName, Mode));
   if FHandle < 0 then
     raise EFOpenError.CreateResFmt(@SFOpenErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
 end;
end;


Fay   (2004-12-06 09:06:00) [2]

2 SeZuka ©   (06.12.04 09:03) [4]
Это, я думаю, баг help-а 8)


SeZuka   (2004-12-06 09:03:00) [3]

2 Александр Иванов ©   (06.12.04 08:27) [1]
Это же двойная работа!

2 Fay ©   (06.12.04 08:28) [2]
Спасибо!
Но все же хочется знать почему TFileStream не работает, это баг дельфи?


Fay   (2004-12-06 08:28:00) [4]

var
fh, n: DWORD;
s, s1: string;
begin
 ...
 fh := CreateFile(PChar(s), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_ALWAYS, 0, 0);
 if fh = INVALID_HANDLE_VALUE then RaiseLastOsError;
 try
   SetFilePointer(fh, 0, nil, FILE_END);
   WriteFile(fh, PChar(s1)^, Length(s1), n, nil);
 finally
   CloseHandle(fh);
 end;
 ...


Fay   (2004-12-06 08:28:00) [5]

2 Александр Иванов ©   (06.12.04 08:27) [1]
Зачем?


Александр Иванов   (2004-12-06 08:27:00) [6]

FileExists


Наверх

Титульная страница Поиск, карта сайта Написать письмо