FTPデータ受信の進捗状況

解決


NORI  2005-08-17 05:25:30  No: 58682

最近はじめたばかりの初心者です。
FTPでのデータ受信で進捗状況をプログレスバーで表示しようと
考えております。

MAX値を取得するため、サーバーに置いてあるファイルサイズを
取得しようと思い、以下のようにしてみましたが、
ファイルサイズが0で返ってきます。
何がいけないのでしょうか?
よろしくお願いいたします。

※ファイルサイズ取得部分
if(pFtpFind->FindFile(サーバーファイルの絶対パス))
{//ファイルが存在する場合の処理
  DWORD dwFileSize;
  pFtpFind->FindNextFile();
  dwFileSize = pFtpFind->GetLength();
}


シャノン  2005-08-18 08:00:22  No: 58683

確かな原因はわかりません。
CFtpFileFind::GetLength が返すサイズは、InternetFindNextFile で取得されており、この中身がどうなっているかはわかりません。

ただ、FTP サーバの仕様として、ファイルサイズを得る確かな方法は無かったと記憶しています。
拡張仕様として、サイズを取得する方法を提供しているサーバもありますが、FTP の正式な仕様ではありません。たぶん。

その所為かどうかはわかりませんが。


RAPT  2005-08-18 10:36:48  No: 58684

(MSDN)CFileFind::GetLength()
> ファイルが 4 GB 以上の場合は、GetLength64 メンバ関数を使います。
は該当しないのでしょうか。

搦め手としては、LISTを取得してサイズを求めるとか。


シャノン  2005-08-18 20:16:13  No: 58685

> 搦め手としては、LISTを取得してサイズを求めるとか。

LIST の結果の書式は実装依存なので、パースが面倒臭いような。


NORI  2005-08-19 23:54:20  No: 58686

参考ご意見、感謝いたします。
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"}

この文字列にファイルサイズがありますので、文字列処理して
取得するようにしてみようかと思います。


シャノン  2005-08-20 00:16:36  No: 58687

> 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 サーバに繋いだときは、うまくいくとは限りません。


NORI  2005-08-20 03:01:06  No: 58688

貴重なご意見ありがとうございます。
汎用的でないので、注意が必要ですね。
とりあえずの解決方法が見つかったところで、安心してました。

今のところサーバーは1つで固定のため、とりあえずこの方法で対処します。
追々汎用的な方法を調べてみようかと思います。
大変ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加