Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
3-59600
Azazello
2003-04-28 14:10
2003.05.19
Текст из TRichEdit.


3-59625
AleksandrKu
2003-04-28 16:21
2003.05.19
доступ к Betrive?


3-59565
Belkova
2003-04-26 14:08
2003.05.19
ComboBox.Items.Add( Edit1.Text


14-59919
Rulya
2003-04-30 10:09
2003.05.19
Выключение компьютера


3-59593
Arkady
2003-04-28 08:23
2003.05.19
Вставка большого файла в базу Access





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский