Я хочу загрузить файл в текущий каталог вместо «c: //». Как это будет сделано?
Мой код:
using namespace std;
#pragma comment(lib, "urlmon.lib")
int main()
{
cout << "downloading update";
HRESULT hr = URLDownloadToFile(NULL, _T("http://download.piriform.com/ccsetup233.exe"), _T("c://ccsetup233.exe"), 0, NULL);
FreeConsole();
}
Ссылка для URLDownloadToFile()
говорит это о szFileName
параметр (акцент мой):
Указатель на строковое значение, содержащее имя или полный путь из
файл для создания для скачивания. Если szFileName включает путь,
целевой каталог уже должен существовать.
Если вы передадите только имя файла вместо полного пути, он будет загружен в текущий каталог. Это явно не задокументировано, но это нормальный способ работы Windows API.
Хотя я бы не рискнул, что текущий каталог на момент вызова URLDownloadToFile()
так же, как это было в начале программы. Любой код мог вызвать SetCurrentDirectory()
изменить текущий каталог на что-то другое.
Чтобы сделать код более надежным, я бы назвал GetCurrentDirectory()
только один раз в начале программы и сохранить путь в переменной. Перед звонком URLDownloadToFile()
Я хотел бы добавить имя файла к этому пути и передать полный путь для szFileName
параметр.
На заметку, вы должны позвонить CoInitialize()
в начале и CoUninitialize()
в конце программы, которая использует URLDownloadToFile()
потому что это COM API. Вы можете обойтись без этого, но это будет чистой удачей и может перестать работать в разных версиях Windows.
Других решений пока нет …