Page 1 of 2

Файлы Files

Posted: 07.05.2011 7:22
by shinma
Нигде не могу найти описание как работать с файлами.

Конкретно алогритм:

1 открыть файл, если его нет создать.
2 записать туда строку, если не пустой дописать в конец.
3 сохранить, закрыть и выгрузить до след раза.

и в вики хорошо бы добавить раздел. Работа с файлами.

Posted: 07.05.2011 8:15
by Vizit0r
будет.
http://stealth.od.ua/forum/viewtopic.php?p=5614#5614

главное - это TFileStream
а так вообще из всех *Stream можно писать в файл

Posted: 07.05.2011 8:41
by shinma
Короче тут дофига мусора я так и не смог создать файл если его нет но допер , что мне надо CreateFile. при таком раскладе мне выдает [Error] (Kazli.sc at 56:89): Type mismatch

Направь на путь истенный

Code: Select all

program kazli;

type
   DWORD = cardinal;
 
   TFileTime= record
      dwLowDateTime: DWORD;
      dwHighDateTime: DWORD;
   end;

   FIND_DATA = record
      dwFileAttributes   : DWORD;
      ftCreationTime      : TFileTime;
      ftLastAccessTime   : TFileTime;
      ftLastWriteTime      : TFileTime;
      nFileSizeHigh      : DWORD;
      nFileSizeLow      : DWORD;
      dwOID            : DWORD;
      cFileName         : array[0..259] of char;
   end; 
   
   
const
Kazli = 'D:\pk.txt';

var
a:FIND_DATA;
hFile:THANDLE;

{  LPCTSTR  lpFileName,                         // имя файла
  DWORD  dwDesiredAccess,                      // режим доступа
  DWORD  dwShareMode,                          // совместный доступ
  LPSECURITY_ATTRIBUTES  lpSecurityAttributes, // SD (дескр. защиты)
  DWORD  dwCreationDisposition,                // как действовать
  DWORD  dwFlagsAndAttributes,                 // атрибуты файла
  HANDLE  hTemplateFile                        // дескр.шаблона файла
}
function FindFirstFile(lpFileName : pChar; var lpFindFileData : FIND_DATA) : THandle; external '[email protected] stdcall';
function CreateFile(lpFileName : pChar; dwDesiredAccess:DWORD; dwShareMode:DWORD; lpSecurityAttributes:DWORD;dwCreationDisposition:DWORD;dwFlagsAndAttributes:DWORD;hTemplateFile:THandle): THandle;
{var
   a:FIND_DATA;
begin
   addToSystemJournal(intToStr(FindFirstFile('c:\s2.txt', a)));
End. }


begin

//List := TStringList.Create;
//List.LoadFromFile(Kazli);
//for i := 0 to List.Count-1 do 
//s:=List.strings[i]+' ';
//addToSystemJournal(intToStr(FindFirstFile(Kazli, a)));
//if (FindFirstFile(Kazli, a)<0)  then    TFileStream.Create(Kazli, fmOpenReadWrite + fmShareDenyNone); 
//TFileStream.Create(Kazli, fmOpenReadWrite + fmShareDenyNone);
CreateFile(Kazli,0,NULL,'FILE_SHARE_WRITE','CREATE_NEW','FILE_FLAG_WRITE_THROUGH',NULL ); 



end.

Posted: 07.05.2011 8:49
by Vizit0r
ты извращенец.

весь этот мусор решается простым
if FileExists (FileName) then ...

Posted: 07.05.2011 8:59
by shinma
проверку я и так вон закоментировал. я уже знаю как проверить я незнаю как создать.

Posted: 07.05.2011 9:07
by Vizit0r

Code: Select all

  if (FileExists(ExtractFilePath(a) + loginCfgName)) then
    mode := fmOpenReadWrite or fmShareDenyWrite
  else
    mode := fmCreate;

  fl := TFileStream.Create(ExtractFilePath(a) + loginCfgName, mode); // пробуем открыть

Posted: 07.05.2011 9:12
by shinma
оо гуд спасиб это уже лучше, а то от win api(к стати только, что узнал, что то что я писал выше это попытки использовать win api) уже голова болит.

Posted: 07.05.2011 9:24
by Vizit0r
это еще не винапи, это баловство :)

Posted: 07.05.2011 9:29
by shinma
выдает 13:27:24:755 [hz]: Exception: Cannot create file "D:\pk.txt". Процесс не может получить доступ к файлу, так как этот файл занят другим процессом at 0.165
Но файда так и не создал на диске д пусто

Code: Select all

program kazli; 
const
Kazli = 'D:\pk.txt';
var
fl:TFileStream;
mode:word;
begin
  if (FileExists(Kazli)) then
    mode := fmOpenReadWrite or fmShareDenyWrite
  else
    mode := fmCreate;
  fl := TFileStream.Create(Kazli, mode); // пробуем открыть 
end.

Posted: 07.05.2011 9:35
by Vizit0r
потому что сам виноват. кто за собой созданный класс будет освобождать?
а он, между прочим остается висеть в памяти и занимает файл!

Posted: 07.05.2011 9:37
by shinma
кто за собой созданный класс будет освобождать?
Где про это можно почитать?

Posted: 07.05.2011 9:40
by Vizit0r
в любом учителе по паскалю.
ЛЮБОЙ обьект (класс) созданный через constructor Create надо после окончания работы делать destructor Free
иначе оно висит в памяти и его уже не убрать оттуда до завершения приложения.

Posted: 07.05.2011 9:43
by shinma
Все равно файла нет, но теперь и ошибок нет

Code: Select all

program kazli;
const
Kazli = 'D:\pk.txt';
var
fl:TFileStream;
mode:word;
begin
 fl.Free; //это чтобы предыдущий  закрыть.
  if (FileExists(Kazli)) then
    mode := fmOpenReadWrite or fmShareDenyWrite
  else
    mode := fmCreate;
  fl := TFileStream.Create(Kazli, mode); // пробуем открыть
 fl.Free; 
end. 

Posted: 07.05.2011 9:43
by shinma
аа блин кнопку обновить нажал все есть

Posted: 07.05.2011 9:44
by shinma
спасибо