![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись и чтение файла. [D7]
Endi © (2004-08-19 01:52:00)Всем привет!
Сегодня возникла проблема, которую я совсем не ждал, да и за проблему никогда не считал.
Такая вот задачка: нужно в файле, нетипизированном, в самом начале записать несколько байтов. Целый день сегодня бьюсь, так и не решил.
Может кто встречался с такой проблемой.
За ранее, спасибо, за помощь.
Endi (2004-08-20 00:30:00) [1]icWasya Огромное человеческое спасибо. :)
А я то никак не мог понять, почему при слиянии FileBuf и Buf у меня все время получалась ошибка.
icWasya (2004-08-19 14:12:00) [2]в догонку
а как надо
var
Buf,FileBuf:AnsiString;
F:file;
Len:cardinal;
begin
AssignFile(F,'c:\aaa.log');
Reset(F ,1); // раз
Len:=FileSize(F);
SetLength(FileBuf,Len);
BlockRead(F,FileBuf [1],Len); //считываю весь файл в FileBuf
closefile(F);
Rewrite(F ,1);// !!!
// нафигReset(F);
Buf:='Added'; //То что нужно записать в начало
BlockWrite(F,Buf [1],Length(Buf)); //Сначала записываю Buf
BlockWrite(F,FileBuf [1],Length(FileBuf)); //Теперь записываю FileBuf
CloseFile(F);
end;
icWasya (2004-08-19 14:04:00) [3][4]
Вот какой код был у меня:
а как надо
var
Buf,FileBuf:AnsiString;
F:file;
Len:cardinal;
begin
AssignFile(F,'c:\aaa.log');
Reset(F ,1); // раз
Len:=FileSize(F);
SetLength(FileBuf,Len);
BlockRead(F,FileBuf [1],Len); //считываю весь файл в FileBuf
closefile(F);
Rewrite(F);
// нафигReset(F);
Buf:='Added'; //То что нужно записать в начало
BlockWrite(F,Buf [1],Length(Buf)); //Сначала записываю Buf
BlockWrite(F,FileBuf [1],Length(FileBuf)); //Теперь записываю FileBuf
CloseFile(F);
end;
Rem (2004-08-19 11:17:00) [4]Reset(F, 1);
Fay (2004-08-19 11:13:00) [5]
procedure TForm1.Button3Click(Sender : TObject);
const
BSZ = 1 shl 16;
var
h, nr, nw : DWORD;
p : PChar;
s : string;
begin
s := 'Строка, которую ты пишешь в начало. Просто пример'#13#10;
p := nil;
h := INVALID_HANDLE_VALUE;
try
GetMem(p, BSZ);
h := CreateFile('c:\_BOL.sql', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if h = INVALID_HANDLE_VALUE then RaiseLastOSError;
ReadFile(h, p^, BSZ, nr, nil);
SetFilePointer(h, 0, nil, FILE_BEGIN);
WriteFile(h, PChar(@s[1])^, Length(s), nw, nil);
while nr > 0 do
begin
WriteFile(h, p^, nr, nw, nil);
ReadFile(h, p^, BSZ, nr, nil);
end;
finally
if h <> INVALID_HANDLE_VALUE then CloseHandle(h);
if p <> nil then FreeMem(p, BSZ);
end;
end;
Smithson (2004-08-19 11:08:00) [6]SetLenght забыл делать строкам :)
Endi (2004-08-19 11:04:00) [7]2gid
Как это? Ты же файл обнулил. Там уже считывать нечего.
Вот какой код был у меня:
var
Buf,FileBuf:AnsiString;
F:file;
Len:cardinal;
begin
AssignFile(F,'c:\aaa.log');
Reset(F);
Len:=FileSize(F);
BlockRead(F,FileBuf,Len); //считываю весь файл в FileBuf
Rewrite(F);
Reset(F);
Buf:='Added'; //То что нужно записать в начало
BlockWrite(F,Buf,Length(Buf)); //Сначала записываю Buf
BlockWrite(F,FileBuf,Length(FileBuf)); //Теперь записываю FileBuf
CloseFile(F);
end;
Так вот это не работает. То он по 512 байт пишет файлы, то они нулевые, а то, вообще ошибку i/o выдает.
Kair_ (2004-08-19 09:37:00) [8]var
b: Byte;
begin
AssignFile(F, 'FileName');
Rewrite(F, 1);
for b := 1 to 10 do
BlockWrite(F, b, 1);
CloseFile(F);
end;
P.S. Кажись так... :)
gid (2004-08-19 09:08:00) [9]assignfile(f,'c:\qqq');
rewrite(f);
reset(f);
write(f,{переменная тавоже типа что и сям файл});
read(f,,{переменная тавоже типа что и сям файл});
seek()//Куда смещаться
closefile(f);//закрыть
Чего еще непонятно??????????
Алхимик (2004-08-19 02:01:00) [10]Как говорится - это не проблема, а задача.
В общем случае:
1.Создал файл.
2.Записал несколько байтов.
3.Присобачил всё остальное.
4.Запомнил имя старого файла.
5.Прибил старый файл.
6.Поменял имя нового файла на имя старого.