FTPをおこなうには?

解決


BECK  2004-09-24 18:24:16  No: 116478

[開発環境]Windows95 + VB5.0
[クライアント]Windows95、Windows2000

FTPにてファイルのアップロード機能を作成しています。
FTP初心者のため、実現方法に何があるか調べてみて実際にサンプルプログラムを
作成し、どの方法でも実現可能ということがわかりました。

(調査した方法)
1.WIN32 API
2.Inetコントロール
3.shellを実行

但し、実際にどの方法を選択すればベストなのか判断ができません。
条件としては、エラー処理(接続エラー、転送エラー等)が出来ることが
第一条件です。

皆様の経験を踏まえて、その方法を選択するのがベストなのかを
アドバイスしていただければと思います。


ねろ  2004-09-24 19:09:06  No: 116479

開発環境は
>[開発環境]Windows95 + VB5.0
で間違いありませんか?
VB5.0はともかくとして、Windows95はなんかレアな感じですが。
>エラー処理(接続エラー、転送エラー等)が出来ることが第一条件です。
FTPではここが1番難しいところですね。
>2.Inetコントロール
だけは鬼門かと。


BECK  2004-09-24 19:20:17  No: 116480

ねろ様

ご回答ありがとうございます

>[開発環境]Windows95 + VB5.0
>で間違いありませんか?
>VB5.0はともかくとして、Windows95はなんかレアな感じですが。
間違いありません。
確かにレアです。開発してる身としては簡便してくださいって感じです。

>FTPではここが1番難しいところですね。
まったくです。。。

>Inetコントロールだけは鬼門かと。
そうなんですか!><
自分の中では、Inetコントロールがいいのかなぁ〜と思っていました。

もし宜しければ鬼門とされる要因を教えて頂けませんでしょうか?
もしやInetコントロールのバグのことでしょうか?
(Microsoftのホームページにそれらしき内容の記述をみました)


魔界の仮面弁士  2004-09-24 19:49:40  No: 116481

> [開発環境]Windows95 + VB5.0
懐! 8年前のOSですね。

> FTPにてファイルのアップロード機能を作成しています。
外部のDLLに頼っても良いのであれば、BASP21 のFTP機能が、比較的使いやすいですよ。

> 但し、実際にどの方法を選択すればベストなのか判断ができません。
以下、個人的な経験から。

Win32 APIは、細かい動作が、IEのバージョンによって変化する事がありますので、
実行環境と開発環境とで、IEのバージョンを、できるだけ揃えておいた方が良いでしょう。

ただ、経験上、AS/400とのFTP通信を行う場合には、FtpCommandでTYPE C 932を送出しても、
SJIS変換が行われないという現象を確認しています。
(コマンドライン版のftpコマンドで、QUOTE TYPE C 932した場合は問題ありませんでした)
まぁ、これは単に、私のコーディングミスだったのかも知れませんけれども。

次に、Inetコントロールですが、これは個人的にはお奨めしません。
このコントロールでのFTP通信は、アスキーモードでの通信がサポートされておらず、
常にバイナリモードで送出される事になります。バイナリファイルとテキストとの
区別が無いサーバー(Windows系など)であれば問題にはなりませんが、汎用機系との
通信が必要な場合、この点が致命的な問題となる事があります。

コマンドライン版のFTPコマンドであれば、これらの問題は発生し難いのですが、
その代わり、コンソールアプリに過ぎないため、結果の解析が面倒となります。
成功したかどうかは、応答コード(RFC959を参照の事)を見る事で判定できますので、
成否の確認程度なら、通信後にログを確認するだけで済むのですが、通信内容に
応じて処理を分岐させたいような場合には、APIなどを使って、標準入出力を
制御する必要が出て来るでしょう。


ねろ  2004-09-24 20:35:38  No: 116482

>もし宜しければ鬼門とされる要因を教えて頂けませんでしょうか?
inetコントロールはちょっとやって直ぐに見切りをつけました。
従って詳しいところまで突っ込んでいません。
魔界の仮面弁士も書いていますが、
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B409931
の問題とか、細かい設定が出来ないとか。
http://www.vector.co.jp/vpack/filearea/win/net/network/copy/index.html
の「FTP忠太」は私の作ったソフトでAPIのWinInet.dllだけで出来ています。
WinInet.dllでこの位までは出来ます。
エラー処理はある程度は出来ますが、サーバーによってはうまくいかない場合も
あります。


けんぼう  2004-09-24 21:46:30  No: 116483

魔界の仮面弁士様がおっしゃるとおり、私も以前BASP21というコンポーネントで実装いたしました。
結構簡単にできた記憶があります。


ねろ  2004-09-24 22:40:29  No: 116484

前記誤記訂正
>魔界の仮面弁士
>魔界の仮面弁士さん
深謝  m(_ _)m


BECK  2004-09-25 00:24:56  No: 116485

大変参考になるアドバイスの数々ありがとうございます。

BASP21なるものを調べ上司に相談したところ
BASP21を使うとなるとインストールが必要となるが
インストールしたことにより既存の機能、クライアントマシンへの
影響は大丈夫か?ということでした・・・

皆様のアドバイスを踏まえ、選択肢を
・WIN32 API(WinInet.dll)
・BASP21
に絞りました。
(自分の中では、WIN32  API。理由はインストールがないから。。(安易))

上記方法の場合の留意点(IEのバージョンについては確認したいと思います)
があれば続けてアドバイスしていただければと思います。

※今のところ、Inetコントロールだけは選択肢から省きました。


魔界の仮面弁士  2004-09-25 03:29:58  No: 116486

> BASP21を使うとなるとインストールが必要となるが
インストーラに含める事もできますので、同時配布は可能ですよ。
サポートを受けたいなら、BASP21 Proを利用するという手もありますし。

> インストールしたことにより既存の機能、クライアントマシンへの影響は
環境依存性は殆ど無いので、あまり心配は要らないと思いますよ。
依存ファイルの一覧も公開されていますしね。

# もちろん、事前の稼動テストは行っておくべきでしょうけれども。

BASP21は、特にASP開発の分野ではかなり有名なソフトなので、
個人的にはお奨めです。もし、BASP21 でも対応しきれない要件であれば、
http://www.grapecity.co.jp/japan/support/database/P1_56.htm
などを使うという手もあります。(インストールが必要な点は変わりませんが)

> (自分の中では、WIN32  API。理由はインストールがないから。。(安易))
どの方法を使うにしても、どうしても幾つかのバグや、限定された仕様などが
ありえますので、事前に、実験用のコードを実際に書くなどして、それぞれの
動作を十分に確かめておいてください。

たとえば、LISTコマンドの結果などは、サーバによって返される形式がまちまちなので、
それを解析している FtpFindFirstFile などの API は、接続対象のサーバが異なれば、
「こっちのサーバからは取得できたけど、このサーバからは取得出来なかった」といった
事態も起こりえます。BASP21 の場合も然りでしょう。

# ちなみに、WinInet.dll の場合、以下のような現象が報告されています。
http://tools.geocities.co.jp/SiliconValley-PaloAlto/1512/@geoboard/350.html

で、特定のコンポーネントではうまく接続できないような場合には、Winsock APIを
直接叩くという力技が使われる事もあります。これなら、サーバ側の動作にあわせて、
応答結果の解析処理を、独自に実装させる事が可能となります。面倒ですけど。

# 以前、平野さん(VBのMSMVPの方です)が書かれた、WinSock による FTP Client の
# サンプルソースが、下記にあります。
http://www.eva.hi-ho.ne.jp/~s_hirano/jank/FTPC/


ねろ  2004-09-25 07:47:06  No: 116487

># ちなみに、WinInet.dll の場合、以下のような現象が報告されています。
私もここで質問しています。
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200312/03120156.txt
ただし、接続先はLINUXでも2000serverでも有りません、たぶん?
geocitiesやinfoseekがLINUXや2000serverなんてことはないような気がしますが。
私の環境では2000serverでは出ません。
とりあえずFTPcommandを併用して逃げています。

他の問題点ですが、私のソフトは2ヶ月で5、000ダウンロード位ですがどの位
不具合報告が来るか楽しみに待っています、今のところ2件です。

>FtpFindFirstFile などの API は、接続対象のサーバが異なれば、
>「こっちのサーバからは取得できたけど、このサーバからは取得出来なかった」
確かに有りますね、geocitiesの場合
hFind = FtpFindFirstFile(hConnection, "/***/index.html", Pdata, 0, 0)
ではFalseが帰って来ますが、
hFind = FtpFindFirstFile(hConnection, "/***/index.html" & "*", Pdata, 0, 0)
こうやれば正しくファイルが帰ってきます。
まあ何れにしろFTPのソフトは結構楽しめますよ。


BECK  2004-09-28 02:33:42  No: 116488

皆様  数々のアドバイス大変ありがとうございます。

結論として、WinInet.dllを使用することにしました。
使用目的として、日付等も使うことがないので
教えて頂いたバグ?!にも当てはまらないかと思います。


雪桜 皇雅  2005-02-22 06:57:40  No: 116489

はじめまして。
皇雅です。

同じ現象でかなり苦しめられていたので
このページを発見し、
>hFind = FtpFindFirstFile(hConnection, "/***/index.html" & "*", >Pdata, 0, 0)
>こうやれば正しくファイルが帰ってきます。
で助かりました。
ありがとうございます!


雪桜 皇雅  2005-02-22 06:57:42  No: 116490

はじめまして。
皇雅です。

同じ現象でかなり苦しめられていたので
このページを発見し、
>hFind = FtpFindFirstFile(hConnection, "/***/index.html" & "*", >Pdata, 0, 0)
>こうやれば正しくファイルが帰ってきます。
で助かりました。
ありがとうございます!


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

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






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