最近はじめたばかりの初心者です。
FTPでのデータ受信で進捗状況をプログレスバーで表示しようと
考えております。
MAX値を取得するため、サーバーに置いてあるファイルサイズを
取得しようと思い、以下のようにしてみましたが、
ファイルサイズが0で返ってきます。
何がいけないのでしょうか?
よろしくお願いいたします。
※ファイルサイズ取得部分
if(pFtpFind->FindFile(サーバーファイルの絶対パス))
{//ファイルが存在する場合の処理
DWORD dwFileSize;
pFtpFind->FindNextFile();
dwFileSize = pFtpFind->GetLength();
}
確かな原因はわかりません。
CFtpFileFind::GetLength が返すサイズは、InternetFindNextFile で取得されており、この中身がどうなっているかはわかりません。
ただ、FTP サーバの仕様として、ファイルサイズを得る確かな方法は無かったと記憶しています。
拡張仕様として、サイズを取得する方法を提供しているサーバもありますが、FTP の正式な仕様ではありません。たぶん。
その所為かどうかはわかりませんが。
(MSDN)CFileFind::GetLength()
> ファイルが 4 GB 以上の場合は、GetLength64 メンバ関数を使います。
は該当しないのでしょうか。
搦め手としては、LISTを取得してサイズを求めるとか。
> 搦め手としては、LISTを取得してサイズを求めるとか。
LIST の結果の書式は実装依存なので、パースが面倒臭いような。
参考ご意見、感謝いたします。
GetLength64 でも同様に0しか返ってきませんでした。
LISTとはどういったものでしょうか?
いろいろ調べていたら、
MFC以外に、SDKの関数でも出来ることを知りました。
こちらでは、他のページなどにも確認が取れている実績の書き込みがありました。
しかし、こちらでも試してみましたが、やはりダメでした。
やはり、FTPサーバーによるのでしょうか。
(※ちなみに、サーバーはAS/400です。)
たまたまなのですが、
pFtpFind->GetFileName()を取得してみたところ、
DOSのDIRコマンドと同じものが取得できました。
{"QSECOFR 1372207 05/08/04 09:54:02 -*DOC /QDLS/SEINOV4/SHU.EXE"}
この文字列にファイルサイズがありますので、文字列処理して
取得するようにしてみようかと思います。
> LISTとはどういったものでしょうか?
コマンドプロンプトを思い出してください。
コマンドを一行打つと、結果が何行かの文字列で返ってきますよね。
FTP サーバとクライアントのやり取りは、水面下ではこのように、テキストの行ベースで行われています。
DOS で DIR と打つと、ファイル名やファイルサイズがずらっと取得できますが、FTP サーバに対して LIST コマンドを打つと
> DOSのDIRコマンドと同じものが取得できました。
> {"QSECOFR 1372207 05/08/04 09:54:02 -*DOC /QDLS/SEINOV4/SHU.EXE"}
こういう結果が返ってきます(おそらくこれが、対象サーバに LIST を発行した結果です)。
> やはり、FTPサーバーによるのでしょうか。
対象のサーバソフトが固定されているのなら、LIST の結果の書式も常に同じでしょうから、それを解析して、ファイルサイズを取り出すこともできます。
ただし、前述したように、違うサーバでは、この通りの結果が返ってくるとは限りません。
LIST コマンドの結果は人間が見るためのものであり、プログラムで処理するのに適した形ではありません。
極論、LIST の結果の中にファイルサイズを返さないサーバソフトがあってもおかしくありません。
そのため、今回はそれでよくても、他の FTP サーバに繋いだときは、うまくいくとは限りません。
貴重なご意見ありがとうございます。
汎用的でないので、注意が必要ですね。
とりあえずの解決方法が見つかったところで、安心してました。
今のところサーバーは1つで固定のため、とりあえずこの方法で対処します。
追々汎用的な方法を調べてみようかと思います。
大変ありがとうございました。
ツイート | ![]() |