MMM_Corp, я не изобретаю велосипед и копировать файлы не проблема, я просто упрощаю код, в реале будет:
1. Считать поток
2. Изменить/обработать
3. Записать новый поток
Просто на данном этапе хочу получить хотя бы простое копирование потоков неограниченных размеров. (Я с потоками первый раз работаю, да и вообще не могу себя причислить к опытным программистам, всё с чего-то учатся, так что не бейте сильно и не посылайте в гугл... там я в первую очередь ищу (вру, я Нигмой пользуюсь), а форумы это последняя стадия...)
Далее по порядку:
1. AssignFile у меня остался с предыдущего варианта считывания информации из файла, я пробовал считывать построчно обычными средствами, но потом отказался от этого способа и решил читать потоки... Не думал, что это может навредить, поэтому оставил, спасибо за подсказку, убрал и буду иметь ввиду в будущем, однако пользы от этого не заметил...
2. IntBuf: array [0..64] of byte от этого варианта я отказался... просто в коменте к коду приводил варианты которые я пробовал... конечный вариант конечно IntBuf: array of byte...
Мне обязательно нужно побайтно считать в массив, чтобы отдельные элементы можно было редактировать и потом из этого массива сделать новый поток...
3. Готовый код я и не прошу... Прошу лишь дать вектор поиска (что вы собственно и сделали)... мне самому интересно разобраться, а не свалить свою задачу кому-либо на плечи... Что такое GetFreemem я так и не нашел... Есть Getmem и Freemem, но они не могут быть аргументами у SetLength... компилятор визжит матюками... Поэтому пробовал их реализовать отдельно:
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var s1,s2,v:string;
i:integer;
Streaml, Stream2: TFileStream;
IntBuf: array of byte;
begin
s1:=edit1.Text;
s2:=edit2.Text;
Showmessage (inttostr(Length(IntBuf))); //проверяю начальную длину массива (0)
try
Streaml := TFileStream.Create(s2, fmOpenRead); //создаю поток из первого файла
GetMem(IntBuf, Streaml.Size); //Выделяю память для массива IntBuf размером равным размеру потока
SetLength(IntBuf, Streaml.Size); //устанавливаю длину массива равную длине потока
Showmessage (inttostr(Streaml.Size)); //проверяю длину потока (344)
Showmessage (inttostr(Length(IntBuf))); //проверяю длину массива (такая же как длинна потока - 344)
i:=Length(IntBuf); //присваиваю переменной значение длинны массива, поскольку в Streaml.ReadBuffer не принимает как аргумент Length(IntBuf)
Streaml.ReadBuffer(IntBuf, i); //читаю поток в массив
Showmessage (inttostr(SizeOf(IntBuf))); //проверяю размер массива, выдает (4) ??? (а длинна 344!!!)
try
i:=Length(IntBuf);
Stream2 := TFileStream.Create(s1, fmOpenWrite or fmCreate); //создаю второй поток
Stream2.Seek(0, soFromEnd); //позиция в конец
Stream2.WriteBuffer(IntBuf, i); //записываю в поток из массива
finally
Stream2.Free;
end;
finally
Streaml.Free;
FreeMem(IntBuf); //освобождаю память
end;
Showmessage ('Успешно!');
end;
Результат: выводятся все шоумеседжи до Showmessage (inttostr(SizeOf(IntBuf))); включительно и выдает ошибку Аксесс Виолейшн...
Подскажите в какую сторону копать?
Что я делаю не правильно?
Почему Длинна массива 344, а размер массива 4?