Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Загрузка файла


Автор: Danillab 14.5.2007, 18:55
Подскажите как можно загрузить файл из Интернета и сохранить его.  smile 
Компилятор: VC++ 2005 Pro

Автор: jonie 14.5.2007, 22:55
поиск используй? http://forum.vingrad.ru/topic-139356.html
ну и ссылки снизу

Автор: Danillab 15.5.2007, 10:32
жму: New -> Project -> Windows Forms Application ввожу название nil

в Solution Explorer выбираю nil.cpp в самый конец вставляю:

Код

//чтобы скомпилировалось в VC++, надо
//в "Project|Properties|Linker|Input|Additional Dependencies"
// добавить"Wininet.lib"

#include <wininet.h>
#include <fstream>


const ERROR_TMPFILE_UNOPENED = 10;
const ERROR_UNABLE_INITILIZE_WININET = 11;
const ERROR_CANNOT_OPEN_URL = 12;
const ERROR_UNLOAD_FILE_FROM_URL = 13;


int DownloadFromURL(CString a_URL, CString a_tmpfile)
{
 const BUFSIZE = 8*1024;

 ofstream ofs(a_tmpfile, ios_base::binary);
 if (!ofs) return ERROR_TMPFILE_UNOPENED;

 HINTERNET hNet = ::InternetOpen("Download Image",
                                PRE_CONFIG_INTERNET_ACCESS,
                                NULL,
                                INTERNET_INVALID_PORT_NUMBER,
                                0) ;
 if (!hNet)  return ERROR_UNABLE_INITILIZE_WININET;

 HINTERNET hUrlFile = ::InternetOpenUrl(hNet,
                                a_URL,
                                NULL,
                                0,
                                INTERNET_FLAG_RELOAD,
                                0) ;
 if (!hUrlFile) 
    {
     return ERROR_CANNOT_OPEN_URL;
     ::InternetCloseHandle(hNet);
    }

 char buffer[BUFSIZE];
 DWORD dwBytesRead=0;
 
 do
   {
    if (!InternetReadFile(hUrlFile, buffer, sizeof(buffer), &dwBytesRead))
         return ERROR_UNLOAD_FILE_FROM_URL;
    if (dwBytesRead) {ofs.write(buffer,dwBytesRead);}
        else break;
   } 
   while (true);

 ofs.close();

 ::InternetCloseHandle(hUrlFile);
 ::InternetCloseHandle(hNet);
 return 0;

}
 

жму F8, компилируется и выдает ошибки.

Output:
Код

------ Build started: Project: nil, Configuration: Debug Win32 ------
Compiling...
stdafx.cpp
Compiling...
AssemblyInfo.cpp
nil.cpp
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(58) : error C2146: syntax error : missing ';' before identifier 'HINTERNET'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(58) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(58) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(59) : error C2143: syntax error : missing ';' before '*'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(59) : error C4430: missing type specifier - int assumedidentifier

...

C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(665) : error C2146: syntax error : missing ')' before identifier 'SYSTEMTIME'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(665) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(669) : error C2059: syntax error : ')'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C2146: syntax error : missing ';' before identifier 'DECLSPEC_IMPORT'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C2086: 'int EXTERN_C' : redefinition
        C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(665) : see declaration of 'EXTERN_C'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C2146: syntax error : missing ';' before identifier 'BOOL'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C2086: 'int DECLSPEC_IMPORT' : redefinition
        C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(665) : see declaration of 'DECLSPEC_IMPORT'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C2146: syntax error : missing ';' before identifier 'STDAPICALLTYPE'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : fatal error C1003: error count exceeds 100; stopping compilation
Generating Code...
Build log was saved at "file://c:\Documents and Settings\Данил\Мои документы\Visual Studio 2005\Projects\nil\nil\Debug\BuildLog.htm"
nil - 283 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========


подскажите что я делаю неправильно.

Автор: Danillab 16.5.2007, 17:04
я уверен что здесь какая то мелкая ошибка, но я не могу ее найти :(

Автор: jonie 17.5.2007, 06:56
а когда это в С++ можно стало писать так?
Код

const ERROR_TMPFILE_UNOPENED = 10;
без указания типа константы?
-----------
+заголовочные файлы подрубить где все - т.е. обычно stdafx.h
+подрубить перед всем этим windows.h
+использование ofstream тут так невозможно (ofstream находится в пространстве std) т.е. нисать либо std::ofstream .... либо использовать using namespace std;
+убрать бесконечный цикл  while (true); если, конечно,это не предпологалось (а судя по дальнейшему коду нет)
+Windows Forms Application сдается мне что это управляемый С++ .... хотя, он и позволяет использовать неуправляемый код...но как насчет руани я хз.

Автор: Danillab 27.5.2007, 06:47
jonie, спасибо за ответы, я просто подумал что код из http://forum.vingrad.ru/forum/topic-139356/anchor-entry1052976/0.html будет нормально компилится.


Сейчас пытаюсь скомпилировать:
Код

#include "stdafx.h"
#include <wininet.h>
#pragma comment(lib, "wininet")

void ddownload(char ot[], char dod[])
{
    HANDLE ih;
    ih = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if (ih == NULL) ih = 0;
    HANDLE fh, f;
    char fbuff[512];
    DWORD r, d, total;
    fh = InternetOpenUrl(ih, ot, NULL, 0, 0, 0);
    if (fh != NULL) {
    f = CreateFile(dod, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
    do {
        memset(fbuff, 0, sizeof(fbuff));
        InternetReadFile(fh, fbuff, sizeof(fbuff), &r);
        WriteFile(f, fbuff, r, &d, NULL);
        total = total + r;
    } while (r > 0);
    CloseHandle(f);
    InternetCloseHandle(fh);
    MessageBox(0,"download complete!","ok",MB_OK);
    } else {
    MessageBox(0,"download failed!:(","ok",MB_OK);
    }

}


вешаю на нажатие кнопки
Код

        private void button1_Click(object sender, EventArgs e)
        {
            ddownload("http://localhost/logo.jpg", "c:\\logo.jpg");
        }



При компиляции получаю такие ошибки:
Код

------ Build started: Project: nil1, Configuration: Debug Win32 ------
Compiling...
wininet.cpp
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(58) : error C2146: syntax error : missing ';' before identifier 'HINTERNET'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(58) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(58) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(59) : error C2143: syntax error : missing ';' before '*'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(59) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(59) : error C2378: 'HINTERNET' : redefinition; symbol cannot be overloaded with a typedef
        C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(58) : see declaration of 'HINTERNET'
...

C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(665) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(665) : error C2065: 'CONST' : undeclared identifier
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(665) : error C2146: syntax error : missing ')' before identifier 'SYSTEMTIME'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(665) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(669) : error C2059: syntax error : ')'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C2146: syntax error : missing ';' before identifier 'DECLSPEC_IMPORT'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C2086: 'int EXTERN_C' : redefinition
        C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(665) : see declaration of 'EXTERN_C'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C2146: syntax error : missing ';' before identifier 'BOOL'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C2086: 'int DECLSPEC_IMPORT' : redefinition
        C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(665) : see declaration of 'DECLSPEC_IMPORT'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : error C2146: syntax error : missing ';' before identifier 'STDAPICALLTYPE'
C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include\wininet.h(671) : fatal error C1003: error count exceeds 100; stopping compilation
Build log was saved at "file://c:\Documents and Settings\Данил\Мои документы\Visual Studio 2005\Projects\nil1\nil1\Debug\BuildLog.htm"
nil1 - 283 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)