昨日の続きで FTP でのアップロード中に経過を表示したいので少し変えてみた。
CFtpConnection::OpenFile で CInternetFile のインスタンスを取得し、それを使ってファイルを書き込む。
触れた感じでの注意点は
- CInternetFile のインスタンスは使い終わったら delete する必要がある
- delete 時にファイルのクローズはされないようなので、明示的に CInternetFile::Close を呼ぶ必要がある
さんぷる
// アップロードファイルを開き、サイズを取得 CFile fin( "new.txt", CFile::modeRead ); ULONGLONG fileSize = fin.GetLength(); ULONGLONG uploadSize = 0; // アップロード先ファイルを開く // (作成した CInternetFile クラスは最後に delete する必要がある) typedef std::shared_ptr< CInternetFile > InternetFile; InternetFile fout = InternetFile( ftp->OpenFile( "new.txt", GENERIC_WRITE, FTP_TRANSFER_TYPE_BINARY ) ); unsigned char buf[8192]; UINT readSize = 0; DWORD old = ::GetTickCount(); ULONGLONG oldPersent = 0; // ファイルをアップロード while ( (readSize = fin.Read( buf, sizeof(buf) )) != 0 ) { fout->Write( buf, readSize ); uploadSize += readSize; ULONGLONG persent = uploadSize * 100 / fileSize; if ( oldPersent < persent ) { oldPersent = persent; std::cout << "\r"; for ( int i = 0; i < 10; ++i ) { std::cout << ((i < (persent / 10)) ? "*" : " " ); } std::cout << " " << std::setw( 3 ) << persent << "%"; } } std::cout << std::endl; std::cout << (::GetTickCount() - old) / 1000 << "秒" << std::endl; // アップロード先ファイルを閉じる fout->Close();