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
спасибо