2017-08-26 16 views
0

"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(); 
} 
+0

パス名なしで "c://ccsetup233.exe"を "ccsetup233.exe"に変更する必要があると思います。 – Amadeus

+1

パスなしでファイル名を指定してください。 '_T(" ccsetup233.exe ")' –

+0

Worked。ありがとうございました。 –

答えて

1

URLDownloadToFile()ための基準は、これがszFileNameパラメータ(強調鉱山)について述べている:

名またはフルパスのを含む文字列値へのポインタダウンロードのために作成するファイル szFileNameにパスが含まれている場合は、 ターゲットディレクトリが既に存在している必要があります。

完全なパスではなくファイル名だけを渡すと、現在のディレクトリにダウンロードされます。これは明示的には文書化されていませんが、Windows APIがどのように動作するかは通常の方法です。

URLDownloadToFile()への呼び出し時のカレントディレクトリは、プログラムの開始時と同じであるとは限りませんが、どのコードでもSetCurrentDirectory()を呼び出して、現在のディレクトリを別のディレクトリに変更している可能性があります。

コードをより堅牢にするには、プログラムの開始時にGetCurrentDirectory()を1回だけ呼び出して、パスを変数に格納します。 URLDownloadToFile()を呼び出す前に、そのパスにファイル名を追加し、szFileNameパラメータの絶対パスを渡します。

COM APIなので、URLDownloadToFile()を使用するプログラムの最後には、最初にCoInitialize()、末尾にCoUninitialize()を呼び出す必要があります。あなたはそれなくして逃げるかもしれませんが、それは純粋な運となり、異なるWindowsのバージョンで動作する可能性があります。

関連する問題