Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.02;
Скачать: CL | DM;

Вниз

Чтение / запись.   Найти похожие ветки 

 
Galiaf   (2005-08-21 12:10) [0]

Вот я беру exe-шник читаю его, потом записываю туда-же всё прочитанное, получаю файл который весит более 2 гигобайтов хотя он весил 300 kb.

procedure TForm1.Button1Click(Sender: TObject);
var
 r: array of Char;
begin
 f:=tfilestream.Create("e:\1.exe",fmopenread);
 ii:=f.Seek(0, soFromEnd);
 setlength(r,ii);
 progressbar1.Max:=ii;
 for i:=0 to ii do
   begin
     f.Read(r[i],i);
     progressbar1.Position:=i;
   end;
 f.Free;
 f:=tfilestream.Create("e:\1.exe", fmopenwrite);
 for i:=0 to ii do
   begin
     f.Write(r[i],i);
     progressbar1.Position:=i;
   end;
 f.Free;
end;


Что я опять начудил???
Может char это не то для чтения файлов, но что тогда?


 
begin...end ©   (2005-08-21 12:20) [1]

> Galiaf   (21.08.05 12:10)

> ii:=f.Seek(0, soFromEnd)
> ...
> f.Read(r[i],i)

Во-первых, после выполнения первой из этих строк позиция внутри файла сместится в его конец. Поэтому при последующем вызове Read не будет читаться ничего. Для получения размера файла используйте свойство TStream.Size.

Во-вторых, второй параметр в Read означает количество байт, которые нужно прочитать. В данном случае оно должно быть равно единице, поскольку каждый раз читается один байт. Однако непонятно, зачем читать по одному байту, когда можно сразу заполнить весь массив содержимым файла.

> f.Write(r[i],i)

В-третьих, в цикле при записи количество записываемых байт тоже почему-то постоянно увеличивается.


 
Galiaf   (2005-08-21 12:40) [2]

Заполнить весь массив содержимым файла?
f.read(r,TStream.Size);
так что ли, хотя я думаю что TStream.Size я использовал неправильно, напишите пожалуйста как правильно читать целеком и записывать. Возможно f.size но я неуверен.


 
begin...end ©   (2005-08-21 12:51) [3]

> Galiaf   (21.08.05 12:40) [2]

Я бы сделал примерно так:

var
 R: array of Byte;


чтение:

begin
 with TFileStream.Create("e:\1.exe", fmOpenRead) do
   try
     SetLength(R, Size);
     Read(R[0], Length(R))
   finally
     Free
   end
end


запись:

begin
 with TFileStream.Create("e:\1.exe", fmOpenWrite) do
   try
     Write(R[0], Length(R))
   finally
     Free
   end
end



Страницы: 1 вся ветка

Текущий архив: 2005.10.02;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.036 c
2-1124892879
globoor
2005-08-24 18:14
2005.10.02
Кириллица


14-1126608425
Ega23
2005-09-13 14:47
2005.10.02
Отмаз :о)


14-1126244073
КаПиБаРа
2005-09-09 09:34
2005.10.02
Мартышка и кокосы.


1-1126604824
DrZBodun
2005-09-13 13:47
2005.10.02
Помогите определится с выбором елемента отображения


5-1101107105
kerim
2004-11-22 10:05
2005.10.02
 Регистрация редактора св-в полей