Почему URLDownloadToFile () не загружает мой файл? - PullRequest
0 голосов
/ 04 ноября 2019

Поэтому я пытаюсь создать функцию для загрузки файла с переменным адресом в зависимости от пользователя с помощью строкового ввода, используя URLDownloadToFile(), однако, похоже, что он не загружает файл на диск. Он пропускает S_OK, E_OUTOFMEMORY и INET_E_DOWNLOAD_FAILURE до UNKNOWN_ERROR. Использование GetLastError() возвращает 2, проверка в Интернете показала, что это означает "Not Found". Я не уверен, был ли это веб-сайт, который я использовал, или нет (это мой собственный сервер с Node.JS, использующий res.download(path, filename)). Надеюсь на помощь, код приведен ниже.

Просто обратите внимание, все правильно включается по мере необходимости, и процесс (безопасно) запускается с SE_DEBUG_NAME, поэтому, надеюсь, не должно быть ошибки разрешения.

// Convert String To Wide String
wstring S2WS(const string& str) {
    int length;
    int slength = (int)str.length() + 1;
    length = MultiByteToWideChar(CP_ACP, 0, str.c_str(), slength, 0, 0);
    wchar_t* buffer = new wchar_t[length];
    MultiByteToWideChar(CP_ACP, 0, str.c_str(), slength, buffer, length);
    wstring out(buffer);
    delete[] buffer;
    return out;
}

// Download File
int download(string url) {
    wstring wUrl = S2WS(url);
    LPCWSTR lUrl = wUrl.c_str();
    TCHAR path[MAX_PATH];
    GetCurrentDirectory(MAX_PATH, path);
    HRESULT response = URLDownloadToFile(NULL, lUrl, path, 0, NULL);
    if (response == S_OK) {
        cout << "S_OK" << endl;
    } else if (response == E_OUTOFMEMORY) {
        cout << "E_OUTOFMEMORY" << endl;
    } else if (response == INET_E_DOWNLOAD_FAILURE) {
        cout << "INET_E_DOWNLOAD_FAILURE" << endl;
    } else {
        cout << "UNKNOWN_ERROR" << endl;
    }
    return 0;
}

// Example Usage
int main() {
    download("http://somewebsite.com/files/textfile.txt");
}

1 Ответ

0 голосов
/ 04 ноября 2019

С URLDownloadToFile , path должен быть путем к файлу, а не путем к каталогу. Вы можете добавить некоторое имя файла к переменной path, и оно должно работать.

TCHAR path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, path);
wcscat_s(path, L"\\filename.txt");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...