InternetOpenUrl как определить что фаил отсутсвует ?
От: BpeDuHKa  
Дата: 29.04.08 07:33
Оценка:
пишу небольшую программку, каторая читает по HTTP бинарные файлы (попросту качает их оттуда)
пример кода^ код несколько избыточен, но не в этом дело

проблема в InternetOpenUrl
если фаил отсутствует на сервере никокой ошибки непроисходит, в итоге дельше по коду создается фаил длинной 0

как отловить что на сервере нет файла test.gz ?

hSession = InternetOpen(_T("Microsoft Internet Explorer"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
   if(hSession == NULL){
   dwError = GetLastError();
   InternetCloseHandle(hSession);
   //обработка ошибки и выход из процедуры
}

hURL = InternetOpenUrl(hSession, _T("http://192.168.0.3/test.gz"), NULL, 0, INTERNET_FLAG_NO_AUTO_REDIRECT | INTERNET_FLAG_RELOAD, 0);                    
if(hURL == NULL){
   dwError = GetLastError();
   InternetCloseHandle(hURL);
   InternetCloseHandle(hSession);    
   //обработка ошибки и выход из процедуры
}

hFile = CreateFile(_T("c:\\myfile.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
if (hFile == INVALID_HANDLE_VALUE) 
{ 
   dwError = GetLastError();
   CloseHandle(hFile);
   InternetCloseHandle(hURL);
   InternetCloseHandle(hSession);
   //обработка ошибки и выход из процедуры
}            

do {
   if (InternetReadFile(hURL, out, sizeof(out), &dwBytesRead))
      WriteFile(hFile, out, dwBytesRead, &dwBytesWritten, NULL);
   } while (dwBytesRead == sizeof(out));
   if(dwBytesRead == 0){
      dwError = GetLastError();
      CloseHandle(hFile);
      InternetCloseHandle(hURL);
      InternetCloseHandle(hSession);
      //обработка ошибки и выход из процедуры
   }
CloseHandle(hFile);
InternetCloseHandle(hURL);
InternetCloseHandle(hSession);
return 0;
Re: InternetOpenUrl как определить что фаил отсутсвует ?
От: BpeDuHKa  
Дата: 29.04.08 07:36
Оценка:
сори за офтопик но поиск по форуму не работает почемуто, а в инете ничего подходящего ненашла
Re[2]: InternetOpenUrl как определить что фаил отсутсвует ?
От: Danchik Украина  
Дата: 29.04.08 10:35
Оценка:
Здравствуйте, BpeDuHKa, Вы писали:

BDH>сори за офтопик но поиск по форуму не работает почемуто, а в инете ничего подходящего ненашла


Может попробовать InternetGetLastResponseInfo?
Re[3]: InternetOpenUrl как определить что фаил отсутсвует ?
От: BpeDuHKa  
Дата: 30.04.08 14:17
Оценка:
D>Может попробовать InternetGetLastResponseInfo?

откуда берется файлик длиной 0 байт стало ясно, сам сервер пытается выслать в ответ ХТМЛ страничку с 404 типа нет файла, но и этого файлика тама нет вот он и высылает пустой это стало ясно когда его туда поставили, стал прилитать файлик в 3кб

а по поводу InternetGetLastResponseInfo щас пытаюсь разобратся
Re[4]: InternetOpenUrl как определить что фаил отсутсвует ?
От: BpeDuHKa  
Дата: 30.04.08 14:58
Оценка:
BDH>а по поводу InternetGetLastResponseInfo щас пытаюсь разобратся

после многих экспериментов пришла к выводу, что удостоверится в том скачен ли нужный файлик вобщем то не удается никак
пошла другим путем, так как 1й скаченый файлик вобщемто является списком документов каторые необходимо обновить то просто порописала в нем 1й строкой чтото типа "бла бла бла система такаято версия такаято" читаю первые строки и определяю скачен ли мой список либо какойто левый фаил. с остальными проще так как имено в 1м файлике хранатся названия документов (файлов) длинна и CRC32 этого более чем достаточно для определения их подлености, малоли какую дрять вышлет хттп сервер
с фтп немного попроще в этом смысле

всем спс
Re[5]: InternetOpenUrl как определить что фаил отсутсвует ?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 02.05.08 21:27
Оценка:
Здравствуйте, BpeDuHKa, Вы писали:

BDH>>а по поводу InternetGetLastResponseInfo щас пытаюсь разобратся


BDH>после многих экспериментов пришла к выводу, что удостоверится в том скачен ли нужный файлик вобщем то не удается никак

BDH>пошла другим путем, так как 1й скаченый файлик вобщемто является списком документов каторые необходимо обновить то просто порописала в нем 1й строкой чтото типа "бла бла бла система такаято версия такаято" читаю первые строки и определяю скачен ли мой список либо какойто левый фаил. с остальными проще так как имено в 1м файлике хранатся названия документов (файлов) длинна и CRC32 этого более чем достаточно для определения их подлености, малоли какую дрять вышлет хттп сервер
BDH>с фтп немного попроще в этом смысле

BDH>всем спс


Попробуй функцию HttpQueryInfo С её помощью можно получить код статуса запроса(STATUS_CODE). Если он 404 — значит файл не найден.
[КУ] оккупировала армия.
Re[6]: InternetOpenUrl как определить что фаил отсутсвует ?
От: sax0n Украина  
Дата: 03.05.08 05:25
Оценка:
Здравствуйте, koandrew, Вы писали:

Вот пример, работающий на основе предыдущего поста.
Только он работает от обратного. Он не проверяет 404, а возвращает лишь по коду 200 или 302 (редирект). В коде может что-нибудь нужно изменить. но в целом работает...

bool CheckUrl(LPSTR url)
{
    bool rez = false;
    LPSTR URL;
    if(lstrlen(url) < 8) return false;
    if(url[4] != ':')
    {
        URL = (LPSTR) malloc(lstrlen(url) + 8);
        lstrcpy(URL, "http://");
        lstrcat(URL, url);
    } else 
    {
        URL = (LPSTR) malloc(lstrlen(url));
        lstrcpy(URL, url);
    }
    HINTERNET hInet = InternetOpen("Check url session", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if(NULL == hInet) return false;
    HINTERNET hFile = InternetOpenUrl(hInet, URL, NULL, 0, INTERNET_FLAG_RELOAD, 0);
    DWORD dwCodeLen = 10;
    LPSTR a = (LPSTR)malloc(32);
    if(HttpQueryInfo(hFile, HTTP_QUERY_STATUS_CODE, a, &dwCodeLen, 0))
    {
        rez = (lstrcmp(a, "200") == 0 || lstrcmp(a, "302") == 0);
    }
    free(a);
    InternetCloseHandle(hFile);
    InternetCloseHandle(hInet);
    return rez;
}
Re[7]: InternetOpenUrl как определить что фаил отсутсвует ?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 03.05.08 23:31
Оценка:
Здравствуйте, sax0n, Вы писали:

Да в целом нормально, но если нужен https, то его придётся поправить...
[КУ] оккупировала армия.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.