Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с WriteFile

27K
07 мая 2010 года
TDK
29 / / 30.09.2008
вот написал вот это :) для скачивание файла по протоколу HTTP
Код:
void GetUpdateInfo (char* cHost, char* cLocal)
{
     HINTERNET hSession;  
     HANDLE hFile;
     char cBuffer[10] = {0};
     DWORD dwBytesRead;
     hSession = InternetOpen("Program", PRE_CONFIG_INTERNET_ACCESS, 0, 0, 0);
     hFile = InternetOpenUrl(hSession, cHost, 0, 0, 0, 0);
     InternetReadFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead);
     InternetCloseHandle(hSession);
     hFile = CreateFile(cLocal, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
     WriteFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead, NULL);  
     CloseHandle(hFile);
}


вроди работает, но есть одно "НО" файл сохраняется размером ровно столько сколько указан размер буфера! Как сделать например если файл имеет размер 16 байт то он сохраняется именно 16 байт, а не 10 или 20?
24K
07 мая 2010 года
engel65536
50 / / 17.10.2007
Наверное, надо писать не:
 
Код:
InternetReadFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead);
    ...
    WriteFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead, NULL);

а:
 
Код:
InternetReadFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead);
    ...
    WriteFile(hFile, cBuffer, dwBytesRead, &dwBytesRead, NULL);
253
07 мая 2010 года
Proger_XP
1.5K / / 07.08.2004
Плюс к сообщению engel65536 оформи всё в цикл по условию вроде do { ... } while (dwBytesRead != 0) и увеличь буфер хотя бы до 2-4 Кб - 10 байт маловато будет.
27K
07 мая 2010 года
TDK
29 / / 30.09.2008
Вот потправил теперь проблема в том что не качает файл больше чем буфер
Код:
void GetUpdateInfo (char* cHost, char* cLocal)
{
     HINTERNET hSession;  
     HANDLE hFile;
     char cBuffer[4096];
     DWORD dwBytesRead;
     hSession = InternetOpen("BML", PRE_CONFIG_INTERNET_ACCESS, 0, 0, 0);
     hFile = InternetOpenUrl(hSession, cHost, 0, 0, 0, 0);
     do
        {
           InternetReadFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead);
           hFile = CreateFile(cLocal, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
           WriteFile(hFile, cBuffer, dwBytesRead, &dwBytesRead, NULL);
        }
     while (dwBytesRead != 0);
     CloseHandle(hFile);
     InternetCloseHandle(hSession);
}
8.2K
07 мая 2010 года
bagie2
299 / / 26.10.2008
в цикле создаете файл?) и почему используете hFile для InternetOpenUrl и эту же переменную для CreateFile

что-нибудт типа
 
Код:
hFile = InternetOpenUrl(hSession, cHost, 0, 0, 0, 0);
     hFile2 = CreateFile(cLocal, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
     while (true)
        {
           InternetReadFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead);      
           if (dwBytesRead == 0) break;    
           WriteFile(hFile2, cBuffer, dwBytesRead, &dwBytesRead, NULL);
        }
     CloseHandle(hFile2);    
     CloseHandle(hFile);

и еще try-finally неплохо прикрутить
253
07 мая 2010 года
Proger_XP
1.5K / / 07.08.2004
Так а зачем ты делаешь CreateFile в цикле-то?

bagie2: synchro :D
27K
07 мая 2010 года
TDK
29 / / 30.09.2008
Сори затупил :rolleyes: нужно выпить чаю :D спасибо все работает
27K
12 мая 2010 года
TDK
29 / / 30.09.2008
Теперь есть маленькая неприятность если качать обычный текстовый файл то "форматирование" ентером теряется и все пишется в одну строчку. Как это подправить?
24K
13 мая 2010 года
engel65536
50 / / 17.10.2007
Если я не ошибаюсь, то HTTP инкапсулирует в себе байты из диапазона [0x20..0xFF] (или даже [0x20..0x7F]), то есть служебные символы перевода каретки не могут быть в теле HTTP-запроса/ответа. Если это так, то вам надо конвертить ваш файл, например по Base64.
8.2K
13 мая 2010 года
bagie2
299 / / 26.10.2008
может вообще проще использовать URLDownloadToFile вот и всё.
60K
22 мая 2010 года
Deerhrthjz
3 / / 14.05.2010
void __fastcall TForm5::Button1ClickTObject Sender

AnsiString dir;
bool bFailIfExists;
dir=Form1->FileListBox1->DirectoryForm1->FileListBox1->Items->StringsForm1->FileListBox1->ItemIndex;
CopyFiledir.c_str,Edit1->Text.c_str,bFailIfExists;
ShowMessage dir;
Form5->Close;
Form1->FileListBox1->Update;

При нажатии на Button1 ничего не происходит.
Кто знает в чем проблема?
и если не ошибаюсь, то секс видео тут
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог