Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2012, 16:15   #1
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию IdHTTP Unknown Protocol

Идет обычная закачка файла, правда по локальной сети

Код:
try {
UnicodeString URL_Download = "\\\\192.168.5.99\\share\\1.exe";
UnicodeString File_Name = "D:\\1.exe";
TMemoryStream* File_Stream = new TMemoryStream;
IdHTTP1->Get(URL_Download, File_Stream);
File_Stream->SaveToFile(File_Name);
delete File_Stream;
} catch (...) {
}
IdHTTP не поддерживает протоколы локальной сети?
Может как-то по другому лучше загружать файл?
Использовал IdHTTP, т.к. нужно к закачке progressbar и докачка файла при разрывах.
Прошу вашей помощи.
Drugnir вне форума Ответить с цитированием
Старый 20.02.2012, 18:08   #2
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

копируйте по старинке, откройте оба файла и копируйте через промежуточный буфер,
и через каждую итерацию цикла обновляйте прогрессбар.
microbit вне форума Ответить с цитированием
Старый 20.02.2012, 18:52   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас протокол то не HTTP.
а так можно простыми файлами.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.02.2012, 21:31   #4
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
у вас протокол то не HTTP.
а так можно простыми файлами.
Я тоже так подумал. Но дело в том, что хотят видеть прогресс загрузки и скорость. Сеть пробита тунелями, да и провайдеры не надежные, возможны разрывы.

Цитата:
Сообщение от microbit Посмотреть сообщение
копируйте по старинке, откройте оба файла и копируйте через промежуточный буфер,
и через каждую итерацию цикла обновляйте прогрессбар.
Что вы имеете ввиду? Если можно объясните.
Drugnir вне форума Ответить с цитированием
Старый 20.02.2012, 21:42   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас расшарены папки как я полагаю?
то есть можно их посмотреть в проводнике?

если да, то два TFileStream и копирование блоками(размер файла узнать можно, размер блока известен, все есть что надо)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.02.2012, 22:18   #6
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Спасибо, Пепел Феникса и microbit понял.
Drugnir вне форума Ответить с цитированием
Старый 21.02.2012, 12:41   #7
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Сделал через буфер, но тут все сразу в буфер и невозможно определить прогресс и скорость закачки.
Код:
TFileStream* FileDownload = new TFileStream(FormFile->FileDownload, fmOpenRead);
TFileStream* FileUpdate = new TFileStream(FormFile->FileUpd, fmCreate | fmOpenWrite);
FileDownload->Seek(0,0);
char *buff;
if ((buff = (char *) malloc(FileDownload->Size)) == NULL)
{
ShowMessage("Ошибка выделения памяти");
return;
}
int Size = FileDownload->Size;
FileDownload->Read(buff,Size);
AnsiString buf = buff;
buf.SetLength(Size);
FileUpdate->Write(buff,buf.Length());
FileUpdate->Free();
FileDownload->Free();
free(buff);
Попробовал разбить буфер, но получилось так, что либо копируются в буфер лишние байты или наоборот не хватает. Не знаю что делать даже. Да и докачку пока не трогал.
Лучше постоянно проверять Size от файла загрузки? если он null, то делать sleep?

Код:
TFileStream* FileDownload = new TFileStream(FormFile->FileDownload, fmOpenRead);
TFileStream* FileUpdate = new TFileStream(FormFile->FileUpd, fmCreate | fmOpenWrite);
char buff[1024];
unsigned long seek = 0;
AnsiString buf;
int Size = FileDownload->Size;
while (Size >= seek)
{
FileDownload->Seek(seek, soFromEnd);
FileDownload->Position = seek;
FileDownload->Read(buff,Size);
FileUpdate->Position = seek;
FileUpdate->Write(buff,Size);
seek += sizeof(buff);
}
FileUpdate->Free();
FileDownload->Free();
free(buff);
Drugnir вне форума Ответить с цитированием
Старый 21.02.2012, 13:42   #8
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

Примерно так
Код:
TFileStream* FileDownload = new TFileStream(FormFile->FileDownload, fmOpenRead);
TFileStream* FileUpdate = new TFileStream(FormFile->FileUpd, fmCreate | fmOpenWrite);
char buff[1024];
INT64	iPoz = 0;
while(FileDownload->Position != FileDownload->Size)
{
	 iPoz = FileDownload->Read(&buff,1024);
	 FileUpdate->Write(&buff,iPoz);
}
delete  FileDownload,FileUpdate;
Скорость измерить, нужно узнать время до и после цикла копирования, размер буфера известен, делим размер на время получаем скорость .
microbit вне форума Ответить с цитированием
Старый 21.02.2012, 14:05   #9
Drugnir
Форумчанин
 
Регистрация: 17.11.2010
Сообщений: 262
По умолчанию

Ага, понятно. А при разрыве &buff будет NULL?
Drugnir вне форума Ответить с цитированием
Старый 21.02.2012, 18:56   #10
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

Не знаю, скорее всего сработает исключение.
microbit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Indy Protocol Version_1.0 Sated445 Работа с сетью в Delphi 5 06.01.2012 09:54
RFB (Remote Frame Buffer Protocol) stalsoft Помощь студентам 0 09.06.2011 15:37
Unknown on line 0 java_91 PHP 2 04.05.2011 00:16
Unknown Product miscreant Помощь студентам 0 15.10.2010 22:46
Procedure unknown yulia БД в Delphi 9 26.01.2009 01:33