Форум: "Потрепаться";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c