読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

MFC de FTP 通信 − その2

C++ MFC

昨日の続きで 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();