2

ftp経由でサーバーにファイルをアップロードできる小さなプログラムを作成しました。一部のファイルのサイズが大きいため、ユーザー用の進行状況バーを作成したいと考えています。したがって、アップロード中に、アップロードされたファイルの割合を取得するために、サーバーに送信されたバイト数を特定の間隔で知る必要があります。私がこれまでに試したこと:

関数 FtpPutFile() を呼び出してファイルをアップロードしている間に、次のコードでスレッドを生成します。

hInternet = InternetOpen(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
hFtpSession = InternetConnect(hInternet, ftpserver, port, user, pass, INTERNET_SERVICE_FTP, 0,    0); 
int filesize = 0; // 2GB max

hFile = FtpOpenFile(hFtpSession,szFileTitle,GENERIC_READ,FTP_TRANSFER_TYPE_BINARY,0);
filesize = FtpGetFileSize(hFile,0); 
cout << "Size: " << filesize << endl; 

ただし、 filesizeが -1 の値を返し続けるため、これは機能しないようです。これは、ファイルに書き込んでいる(アップロード部分)と同時に、ファイルサイズを取得するために読み込もうとしていることが原因だと思います。そして、これは不可能だと思います(間違っている場合は修正してください)。

私の主な質問: FTP アップロードの進行状況バーを作成する別の方法はありますか? おそらく、関数 readBytesCount() を使用してアップロードされる前にバイトをカウントします (これが可能かどうかはわかりません)。

4

2 に答える 2

2

あなたはしたい:

  1. InternetSetStatusCallback転送中に定期的に呼び出される関数を設定するために呼び出します。
  2. の最後のパラメータに (ゼロ以外の) 値を渡しますFtpOpenFile。これは、転送中にステータス コールバック関数に戻されます。

次に、FTP 操作中に、コールバック関数が定期的に呼び出され、転送の進行状況に関する情報がユーザーに表示されます。

ただし、転送中の実際のバイトを表示できるとは思いません-メモリが機能する場合、ハンドルを開く、名前を解決する、Cookieを送受信する、最後に閉じるなど、転送の個別の手順がほとんど表示されますハンドル。

ファイル自体の転送中に書き込まれる実際のバイト数に対処するには、通常、ローカル ファイルからバッファーいっぱいのデータを読み取り、InternetWriteFile. これにより、これまでに書き込まれたバイト数をファイルの合計サイズで割って (さらに 100 を掛けて) 転送されたパーセンテージを計算できます。

于 2012-08-05T15:17:22.390 に答える
0

さて、私はファイル全体を 1 回の呼び出しで送信する代わりに、ファイルをチャンクで送信し、進行状況を更新することで、このような問題を解決しました。FtpPutFile

つまり:

 FtpOpenFile(...)
 for( ... )
 {
    InternetWriteFile(... dwChunkSize...)
    UpdateProgressBar(dwChunkSize)        
 }
 InternetCloseHandle(...)
于 2012-08-05T15:44:11.900 に答える