inetコントロールを使用してテキストファイルをUNIXのマシンにftpで転送しようとしています。下記の様に作成したのですが、データは転送されるのですが、転送後にコマンドを終了するとタスクマネージャー上で”応答なし”の状態で止まってしまいます。また、改行コードを変換しようと思うのですがどのようにするのが良いのでしょう?初めてinetを使用するので色々調べたつもりですが上手くいきません。どなたか助けてください。お願いします。
Private Sub Command1_Click()
With Inet1
.URL = "ftp://***.***.***.***"
.UserName = "****"
.Password = "****"
.Protocol = icFTP
Do While .StillExecuting = True
DoEvents
Loop
.Execute , "put d:\work\****.txt /usr2/****.txt"
End With
IntReturn = MsgBox("終了しました", vbOKOnly)
If IntReturn = vbOK Then
Inet1.Execute , " quit"
End
End If
End Sub
書き忘れが有りました、
使用環境はWin2K、VB6になります。
よろしくお願いします。
直接解決になるかどうかわかりませんが、下から3行目のEndステートメントがとても気になります。
Unload Me ではまずいのでしょうか?
経験的にVB6でのEndステートメントは、使用しているオブジェクトの解放手順が
見にくくなるので、私は使用を避けていますが。
>改行コードを変換しようと思うのですが
VBの改行はChr(13) & Chr(10)で
UNIXの改行はChr(10)ですから
ファイルを一回読み込みこむ必要がありますが
読み込んだテキストの文字列をsとすると
s = Replace(s, vbCrLf, vbLf)
こんなことに、
ちなみにリッチテキストでやると読み込みから変換、保存まで
RichTextBox1.LoadFile "***.txt"
RichTextBox1.Text = Replace(RichTextBox1.Text, vbCrLf, vbLf)
RichTextBox1.SaveFile "***.txt", 1
こんなことに。
>”応答なし”の状態で止まってしまいます
MASHERさんのおっしゃるように"End"は使わない方が良い様ですが。
Inet1.Execute , " quit"
の後に"DoEvents" を入れてみたらどうなりますかね。
MASHER様、ねろ様、ご回答ありがとうございました。
他の業務に追われてしまっていてお礼の言葉が遅くなりましたこと、お詫びいたします。
s = Replace(s, vbCrLf, vbLf)
は、使用しているのですが上手くいきません。
UNIX上で”^M”が付いてしまいます。
根本的に私の間違いなのでしょうか?
Open file01 For Input As #1
Do While Not EOF(1)
Line Input #1, str01
str01 = Replace(str01, vbCrLf, vbLf)
Open file02 For Append As #2
中略
Print #2, str01
Close #2
Loop
この様に記述しているのですが・・・
また、”Unload Me ”、”DoEvents”にしてみたのですが、
応答無しの状態になってしまいました。
ただ、分かった事は60秒程経つと終了する事です。
ご回答本当にありがとうございました。
また、何かお気づきになりましたらご教授願います。
>根本的に私の間違いなのでしょうか?
多分。(^^;
先ずLine Inputで読み込んだ行にはVbCrLfは含まれません。
従ってこれは意味がありません。
>str01 = Replace(str01, vbCrLf, vbLf)
Print#はシーケンシャルモードの書き込みですから、
最後にVbCrLfを付けます。結果的には前と同じファイルが
出来上がります。それをUNIXで読ませると、初めの
VbCrは^Mとして読み、次のVbLfは改行として読んでいるのです。
Line Inputで読む -> VbLfを足す
これを文字列として足しこんでいって、最後にバイナリーモード
で書き込む、こんな感じでしょうか。
>分かった事は60秒程経つと終了する事です。
何処で時間が掛かるのでしょうか、Step実行をしてみたら
いかがですか。
ねろ様。
早速のご指摘、ありがとうございます。m(__)m
今年に入ってから全くの独学で頑張っているものですから、
生きたご意見(笑)、とても参考になります。
出社した時にもう一度頑張ってみます。
ありがとうございました。
良いご報告ができる様頑張ります。
》 nozza_hotさん
> Inet1.Execute , " quit"
PUTしか使っていないなら、QUITは不要らしいです。
http://support.microsoft.com/default.aspx?scid=kb;ja;409931
》 ねろさん
> Line Inputで読む -> VbLfを足す
> これを文字列として足しこんでいって、最後にバイナリーモード
> で書き込む、こんな感じでしょうか。
最後をLF改行で出力したいのであれば、
Print #2, str01
ではなく、
Print #2, str01; vbLf;
もしくは
Print #2, str01 & vbLf;
と書くだけでもOKです。バイナリモードは使わなくても大丈夫ですよ。
》 nozza_hotさん
> ただ、分かった事は60秒程経つと終了する事です。
Executeメソッドの実行後に、Executeが完了するまで待機するために
「DoEvntsループによる待機」を行うと、終了まで時間がかかってしまう事が
あるという噂を聞いた事があります。(確認したわけではありませんが)
StillExecutingが変化するまでループする、という作りをやめて、
イベントベースの処理、すなわち、StateChangedイベントを使って、
State = icResponseCompleted になった時に、Executeが完了したと
みなすような作りにしてみては如何でしょう。
魔界の仮面弁士様、ご指摘ありがとうございます。
連休明けに早速試させていただきます。
皆様に暖かい手を差し伸べていただき、本当に感謝いたしております。
ありがとうございました。
なるほど
>Print #2, str01; vbLf;
これでいいんですか。
初めに言おうと思ったのですが、ファイル変換、処理待、などを考えると
Inetコントロールを使うより WinInet Dllの FtpPutFileを使った方が
簡単かも知れません。
私もFtpサーバーとのやり取りのプログラムを幾つか作っていますが、
Inetコントロールは初めから選択肢に入れてありません。
魔界の仮面弁士様、ありがとうございました。
Print #2, str01; vbLf;
に変更したら上手くいきました。
>Executeメソッドの実行後に、Executeが完了するまで待機するために
>「DoEvntsループによる待機」を行うと、終了まで時間がかかってしまう事が
>あるという噂を聞いた事があります。(確認したわけではありませんが)
教則本に、例題として載っていたのでそのまま引用したのですが・・・
色々あるものですねえ。
連続でファイルを転送したいものですから、
StateChangedは自分の宿題としてもう少し考えたいと思います。
ねろ様。
”WinInet Dllの FtpPutFile”もこれから、勉強させていただきます。
魔界の仮面弁士様、ねろ様、MASHER様、本当にありがとうございました。
また、何か有りましたらご教授のほど宜しくおねがいいたします。
> 教則本に、例題として載っていたのでそのまま引用したのですが・・・
ループで待機させる方法は、簡単でわかりやすいので、サンプルとしては
良く利用されていますが、VBではあまり良い方法では無いとされています。
VBは、「イベント駆動型(event driven)」の言語です。
本来は、イベント(ユーザや他のプログラムが実行した操作)に
対応して処理を行なうのが、適切なスタイルとなります。
StateChangedイベントを使った方法というのは、Executeメソッドによる
通信が完了した時に、InetコントロールからVB側に、イベントとして
「通信が終わりましたよ」と伝えてもらい、そのタイミングで
次の処理を行わせようというコーディング方法です。
一方、最初に使われていた、StillExecutingプロパティが変化するのを
ループで監視する手法は、VBからInetコントロール側に、何度も何度も
「処理が終わりましたか?」と尋ね続ける手法になります。(効率が悪い)
一応、効率が悪くても実行する事はできるのですが、その場合、
フォームを閉じる際の処理には、充分に注意する必要があります。
ループ中のDoEventsが実行されているときに、ユーザー操作によって
フォームが閉じられたりすると、フォームが非表示で残ってしまい、
いつまで経っても、アプリケーションが終了しないという事もあります。
# これは、「フォームがアンロードされた後」で、そのフォーム上の
# コントロールやプロパティ等にアクセスした場合に、そのフォームが、
# 自動的にロードされなおされてしまう、という理由による物です。
> StateChangedは自分の宿題としてもう少し考えたいと思います。
これに関しては、ヘルプの以下の項を参照して見てください。
「Executeメソッド + StateChangedイベント」の使い方が書かれています。
[Visual Studio 6.0 ドキュメント]
└[Visual Basic ドキュメント]
└[Visual Basic の使用方法]
└[コンポーネント ツール ガイド]
└[ActiveX コントロールの使い方]
└[ActiveX コントロールの使い方]
└[インターネット トランスファ (Inet) コントロールの使い方]
ねろさん
> Inetコントロールを使うより WinInet Dllの FtpPutFileを使った方が
> 簡単かも知れません。
うちでは、BASP21 (あるいはBASP21 Pro)のFTPオブジェクトを使うことが多いです。
http://www.hi-ho.ne.jp/babaq/basp21.html
魔界の仮面弁士様。
大変勉強になります。
本当にありがとうございました。
ツイート | ![]() |