Вниз
Скачать: CL | DM;

TFileStream, я надеюсь всё будет хорошо :)   Найти похожие ветки 

← →
Chlavik ©   (2003-04-28 02:34) [0]

Дотрый вечер ... С прадником ВАС!!!!!!!! Ребята помогите мне Please ! Как мне создать Stream (TFileStream) куска файла ну т.е. не от начала а от допустим От середины... и до конца... Мне просто уже надоело эксперементы проводить... Я пробовал Seak ... Ну короче у меня не получилось... Дело в том что у меня есть допустим начальный Offset и мне надо от этого места до конца файла замутить Stream (это для докачки, пишу Ftp клиент...) У меня сначало всё пахало через Seek но когда я переписал всё в отдельный поток - что то случилось и оно не пашет. Что то я увлёкся с печатью.. Короче Help пожалуйста!


← →
Крот ©   (2003-04-28 05:39) [1]

Код покажи и объясни ЧТО конкретно не пашет.


← →
Chlavik ©   (2003-04-28 13:58) [2]

StartOffSet:=Ftp.Size(ExtractFileName(CurrentUpload.FFile));
if StartOffSet=-1 then StartOffSet:=0;
Stream:=TFileStream.Create(CurrentUpload.FFile,fmOpenRead);
try
CurrentUpload.Size:=Stream.Size;
if StartOffSet<CurrentUpload.Size then
begin
Stream.Seek(StartOffSet,soFromBeginning);
//ShowMessage(IntToStr(Stream.Position)+" "+IntToStr(StartOffSet));
Ftp.Put(Stream,ExtractFileName(CurrentUpload.FFile),true);
end;

Короче файл дописываеься полностью а не та часть котрой не хватает...


← →
evvcom ©   (2003-04-28 14:18) [3]

А Ftp.Put - это что? Декларация какая?
Может будет проще в буфер прочитать сначала Stream.Read, а уже потом Ftp.Put вызывать?


← →
Chlavik ©   (2003-04-28 14:25) [4]

Так в том то и ворпос мой что как подготовить мне Sream что бы он был Именно куска файла (От SrartOffset)


← →
evvcom ©   (2003-04-28 14:41) [5]

Еще есть TMemoryStream. Если без Stream не обойтись, то, наверное, так (что-то не нашел я в стримах копирование в другой стрим с текущей позиции):
var Buf: array[0..Count] of Byte;
FileStream.Seek(...)
FileStream.Read(Buf, Count);
MemoryStream.Write(Buf, Count);


Ну естественно с проверкой Count и возможно в цикле.


← →
Zelius ©   (2003-04-28 14:47) [6]

Ты можешь посмотреть реализацию Ftp.Put? Запросто может быть, что он изменяет текущую позицию в потоке! Что это вообще за объект?


← →
Chlavik ©   (2003-04-28 15:04) [7]

procedure Put(const ASource: TStream; const ADestFile: string; const AAppend: boolean); overload;
procedure Put(const ASourceFile: string; const ADestFile: string; const AAppend: boolean); overload;

Parameters

const ASourceFile: string

File containing data to be uploaded.


const ADestFile: string = ""

Destination file name on the remote FTP server.


const AAppend: boolean = false

Default value is False.


Description

Put is an overloaded procedure that uploads data to a file with the name specified in ADestFile on the FTP server. The uploaded data can be either a stream (ASource) or a name of a file which exists on the user"s computer (ASourceFile).
Setting AAppend to True causes the server to append the file being uploaded to one which already exists on the FTP server.


← →
evvcom ©   (2003-04-28 15:04) [8]

Он может и не изменяет позицию в потоке, а просто вызывает ReadBuf вместо Read, а вот ReadBuf и изменяет эту позицию.


← →
Chlavik ©   (2003-04-28 15:06) [9]

Если я буду чиать в какойто Array of byte to памяти не хватит если буду слать файли большого размера например 100Mb..


← →
Карелин Артем ©   (2003-04-28 15:14) [10]

Ну и зачем ты делаешь файловый поток для отсылки файла по FTP? Почему не так:
Ftp.Put(CurrentUpload.FFile,ExtractFileName(CurrentUpload.FFile),true); ???


← →
Zelius ©   (2003-04-28 15:28) [11]

кстати, а не правильнее будет вместо
CurrentUpload.Size:=Stream.Size;
сделать
CurrentUpload.Size:=Stream.Size - Stream.Position;
?


← →
Chlavik ©   (2003-04-28 17:29) [12]

Карелин Артем © (28.04.03 15:14) => Потому что мне надо сделать докачку а в Ftp.Put(CurrentUpload.FFile,ExtractFileName(CurrentUpload.FFile),true); таком случае оно просто допишет в конец целый файл...


Zelius © (28.04.03 15:28) =>
CurrentUpload.Size мне нужен размер файла, я юзаю его для вывода данных на экран.. И еще в некоторых местах


← →
Chlavik ©   (2003-04-28 17:31) [13]

Так главное что раньше всё пахало через Seek а щяс не хочет...


← →
Zelius ©   (2003-04-28 17:35) [14]

а как объявлен Stream?


← →
Chlavik ©   (2003-04-28 17:41) [15]

Короче даю вам Кусок Процедуру моего класса:
procedure TUploadThrd.StartUpload;
var Stream:TFileStream;

begin
CurrentUpload:=ReadUploadData(CreateFileName(FileName));
if CurrentUpload.Offset=0 then if not CheckMp3Tag(CurrentUpload.FFile) then
begin InitUpload(CurrentUpload); exit; end;

StartOffSet:=Ftp.Size(ExtractFileName(CurrentUpload.FFile));
if StartOffSet=-1 then StartOffSet:=0;
Stream:=TFileStream.Create(CurrentUpload.FFile,fmOpenRead);
try
CurrentUpload.Size:=Stream.Size;
if StartOffSet<CurrentUpload.Size then
begin
Stream.Seek(StartOffSet,soFromBeginning);
// ShowMessage(IntToStr(Stream.Position)+" "+IntToStr(StartOffSet));
Ftp.Put(CurrentUpload.FFile,ExtractFileName(CurrentUpload.FFile),true);
end;
finally
Stream.Free;
end;
end;


← →
Zelius ©   (2003-04-28 17:47) [16]

Вроде нормально... Вобщем, путь тебе в отладку, пройтись по процедуре Put, думаю, что ответ там лежит...


← →
Zelius ©   (2003-04-28 17:55) [17]

а ты сам видел, что у тебя написано????
Ftp.Put( CurrentUpload.FFile ,ExtractFileName(CurrentUpload.FFile),true);
а зачем тогда поток открывал, позиционировал? :)


← →
Chlavik ©   (2003-04-28 17:58) [18]

Та это я попробовал после того как мне посоветовал
Карелин Артем © (28.04.03 15:14) (Всё как я описал..) ... Забыл поменять обратно просто.. У меня всё было к в начальном моём примере...


← →
Chlavik ©   (2003-04-28 18:02) [19]

Что самое интересное ЧТО ЭТО ВСЁ ПАХАЛО но пахало это у меня когда я просто это всё делала в гланом потоке проги (ну просто перетащил компонент TidFTP на форму и всё что ему нада написал ...) Но там у меня возникла проблема (пока выполнялся FTP.PUT то программа "замерзала") Тогда я написал клас (TUploadThrd) на основе потока и теперь имею....


← →
Zelius ©   (2003-04-28 18:03) [20]

ясно! вобщем, повторюсь - отладка нужна...


← →
Chlavik ©   (2003-04-28 21:18) [21]

Всё OK!, короче я порылся дебаггером в самом idFtp оказалось следующее, что если его свойство Passive установить в True то при выполнении Put позиция в стриме ставилось на ноль ... А если Passive:=false то закачка делается с той позиции в которой стоял стрим.. К своству Passive это в принципе никакого отношения не имеет, в хелпе пишется что мол это просто влияет на команды серверу типа что если Passive:=true то не все Ftp сервера поддерживают какиео команды, так что возможно что разработчик этого компонента "провтыкал",а может это я провтыкал :) короче главное что всё пашет... Пасиба всем за помощь!



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

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.009 c
3-59552
РВА
2003-04-25 14:03
2003.05.19
Запросы к лок. таблицам


1-59762
cult
2003-05-06 15:20
2003.05.19
HTML to text


1-59659
Евгений
2003-05-06 23:06
2003.05.19
Как мне записать массив в файл


8-59810
Natalia
2003-02-04 10:48
2003.05.19
картинка и рабочий стол


8-59807
Rom@n
2003-02-08 08:26
2003.05.19
Мультимедиа




   Наверх