INET を使用してFTPをしているのですが、
わざとエラーがでるように設定していて、エラーメッセージの内容
を確認していますが、いつも
VB ERRNUMBER 35764 "最後の要求が実行中です。"
とでるのですが、どういう意味か分かりますか。
分かる方教えて下さい。
『最後の要求』が実行中というエラーは、
『前回の命令(ファイルのダウンロードやアップロードなど)』が
完了していないのに、次の命令が要求されたという事を意味します。
StateChangedイベント等について調べてみてください。
ファイル転送もできていないのに、"ファイル転送が
成功しました。" というメッセージがでます。
INET を使用してのFTPのやり方ですが
以下でいいでしょうか。
'** inet 接続
With Inet1
.URL = "ftp://" & wURL
.RequestTimeout = wTIMEOUT
.UserName = wUSER
.Password = wPASS
.Execute , "Ascii"
.Execute , "put " & wkFile & " " & wID & Format(Now, "YYYYMMDDhhmmss")
Do While .StillExecuting = True
DoEvents
Loop
.Execute , "close"
.Execute , "QUIT"
End With
'** inet 解除
Inet1.Cancel
MsgBox "ファイル転送が成功しました"
Private Sub Inet1_StateChanged(ByVal State As Integer)
Dim vntgetdata As Variant '受信データ
'データ(コマンド結果)を取得する
If State = icResponseCompleted Then
vntgetdata = Inet1.GetChunk(1256, icString)
MsgBox vntgetdata
End If
End Sub
これだと不安です。
正しいかだれかわかりますか。
もし、おかしい場所があれば教えて下さい。
> Do While .StillExecuting = True
> DoEvents
> Loop
それは、StateChangedイベントを使わない時の待機方法です。
空ループ処理にもCPUは消費しますので、イベントで制御するならば、
ループは行わない方が良いと思います。
> vntgetdata = Inet1.GetChunk(1256, icString)
Inetコントロールは、ASCIIモードに対応していないそうです。
icStringではなく、icByteArrayで取得した方が良いかも知れません。
また、そのコードでは、最大でも1256バイト分のチャンクしか取得できません。
GetChunkの戻り値が空になるまで、繰り返しGetChunkするようにしてみてください。
魔界の仮面弁士 さん
返答ありがとうございます。
VBのINETを使用するのは、本当に素人ですので、
以下の所をどのように書き換えたら
よろしいでしょうか。
また、CLOSEの書く場所は、正しいと思いますか。
ファイル転送もできていないのに、
成功しました。とでるのは、CLOSEの書く場所
が違うからではないでしょうか。
すみませんが、分かりますでしょうか。
> Do While .StillExecuting = True
> DoEvents
> Loop
それは、StateChangedイベントを使わない時の待機方法です。
空ループ処理にもCPUは消費しますので、イベントで制御するならば、
ループは行わない方が良いと思います。
個人的な意見として、Inetはやめておいた方がいいと思いますが、どうしてもと言うなら。
With Inet1
.URL = "ftp://" & wURL
.RequestTimeout = wTIMEOUT
.UserName = wUSER
.Password = wPASS
.Execute , "put " & wkFile & " " & wID & Format(Now, "YYYYMMDDhhmmss")
End With
Private Sub Inet1_StateChanged(ByVal State As Integer)
Dim tData As Variant ' データを入れる変数。
Dim sData As String
Debug.Print State '状態を書き出す
Select Case State
Case icResponseCompleted
Do
tData = Inet1.GetChunk(1024, icString)
sData = sData & tData
Loop While (Len(tData) <> 0)
Text1.Text = sData
End Select
End Sub
とでもして、イミディエイトウィンドウとMSDNのStateChangedのヘルプのState の値を
見ながらデバッグしたらいかがですか。
とりあえずCLOSEは
Private Sub Command2_Click()
Inet1.Execute "CLOSE"
End Sub
とでもして。
WinInetの方が「吉」ですよ。
返答ありがとうございます。
INETじゃないとだめという事はまったくありません。
すいません初心者なので、
WinInet ではどのように書くのですか
お手数だと思いますが教えていただけないでしょうか。
よろしくお願いします。
FTPによる同期通信には、basp21 がお奨めです。
ログ出力機能も実装されていますし、VBからの扱いも簡単かと。
http://www.hi-ho.ne.jp/babaq/basp21.html (Free版 BASP21.DLL)
http://www.b21soft.co.jp/basp21/ (製品版 BASP21 Pro)
外部コンポーネントを使ってはいけないのであれば、
ねろさんの回答にある WinInetという選択肢もあります。
google等で検索すると、WinInetのサンプルも見つかるでしょう。
ここにサンプルコードが有ります。
http://support.microsoft.com/default.aspx?scid=kb;ja;175179
http://www.galliver.co.jp/writing/susume_vb/tre902/
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/0003/api/