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);
}
Проблема с WriteFile
Код:
вроди работает, но есть одно "НО" файл сохраняется размером ровно столько сколько указан размер буфера! Как сделать например если файл имеет размер 16 байт то он сохраняется именно 16 байт, а не 10 или 20?
Код:
InternetReadFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead);
...
WriteFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead, NULL);
...
WriteFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead, NULL);
а:
Код:
InternetReadFile(hFile, cBuffer, sizeof(cBuffer), &dwBytesRead);
...
WriteFile(hFile, cBuffer, dwBytesRead, &dwBytesRead, NULL);
...
WriteFile(hFile, cBuffer, dwBytesRead, &dwBytesRead, NULL);
Плюс к сообщению engel65536 оформи всё в цикл по условию вроде do { ... } while (dwBytesRead != 0) и увеличь буфер хотя бы до 2-4 Кб - 10 байт маловато будет.
Код:
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);
}
{
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);
}
что-нибудт типа
Код:
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);
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 неплохо прикрутить
bagie2: synchro :D
Сори затупил :rolleyes: нужно выпить чаю :D спасибо все работает
Теперь есть маленькая неприятность если качать обычный текстовый файл то "форматирование" ентером теряется и все пишется в одну строчку. Как это подправить?
Если я не ошибаюсь, то HTTP инкапсулирует в себе байты из диапазона [0x20..0xFF] (или даже [0x20..0x7F]), то есть служебные символы перевода каретки не могут быть в теле HTTP-запроса/ответа. Если это так, то вам надо конвертить ваш файл, например по Base64.
URLDownloadToFile вот и всё.
может вообще проще использовать
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 ничего не происходит.
Кто знает в чем проблема?
и если не ошибаюсь, то секс видео тут