FTP コマンドについて

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
ばね

FTP コマンドについて

#1 投稿記事 by ばね »

はじめまして。初心者ですがよろしくお願いします。

Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (sAgent As BytePtr,_
lAccessType As Long,sProxyName As BytePtr,sProxyBypass As BytePtr,lFlags As Long) As Long
Declare Function InternetCloseHandle Lib "wininet.dll" (hInet As Long) As Integer
Declare Function InternetConnect Lib "wininet" Alias "InternetConnectA" (Session As Long, ServerName As String,_
Port As Long, UserName As String, Password As String, Service As Long, Flags As Long, Context As Long) As Long
Declare Function FtpPutFile Lib "WinInet.DLL" Alias "FtpPutFileA" (hFtpSession As Long,lpszLocalFile As String,_
lpszNewRemoteFile As String,dwFlags As Long,dwContext As Long) As Long

Const INTERNET_OPEN_TYPE_PRECONFIG=0 'IEの設定で接続
Const INTERNET_OPEN_TYPE_DIRECT=1 '直接接続します
Const INTERNET_OPEN_TYPE_PROXY=3 'プロキシ経由で接続します
Const INTERNET_DEFAULT_FTP_PORT=21 'ftpポートです
Const INTERNET_DEFAULT_HTTP_PORT=80 'httpポートです
Const INTERNET_DEFAULT_HTTPS_PORT=443 'httpsポートです
Const INTERNET_SERVICE_FTP=1 'ftpを要求
Const INTERNET_SERVICE_HTTP=3 'httpを要求
Const INTERNET_FLAG_RELOAD=&H80000000 'キャッシュを使用しません
Const FTP_TRANSFER_TYPE_BINARY=&H2 'バイナリモードで受信します

Dim open As Long
Dim ftp As Long

open=InternetOpen(0,0,0,0,0)
ftp=InternetConnect(open,"111.222.0.100",21,"anonymous","user",INTERNET_SERVICE_FTP,0,0)
If ftp=0 Then MsgBox 0,"エラー","",MB_OK:End

FtpPutFile(ftp,"C:\123\ttsstt","O0001",FTP_TRANSFER_TYPE_BINARY,0)

InternetCloseHandle(ftp)
InternetCloseHandle(open)
End


いろいろサンプル見ながらやっと Get Putは出来るまでになりました。
次にFTPサーバのカレントディレクトリ表示と、その中のファイル一覧を調べたいのですが・・・
いろいろサンプルを見てると、かえってパニックになってしまって。
という事で先輩方に助けて欲しくお願いにきました。
宜しくお願いします。
situmon
記事: 35
登録日時: 2005年5月31日(火) 09:39
お住まい: 岐阜

#2 投稿記事 by situmon »

はじめまして。situmonと名乗っているものです。

Socketを使った方法しかやったことがないのですが、
実践コードモジュールにサンプルを乗せておきました。

もしよろしければ参考にしてみてください。
ばね

#3 投稿記事 by ばね »

アドバイス有難うございます。
何とか、形がみえてきました。

ListBox1つ  EditBoxが元ファイル名・送信ファイル名の2つ CommandButtonが送信・リセット・終了・表示の4つ からなる
MainWndのプログラムです。

何分、いろいろなサンプルを利用させていただきながら、作りましたので自分でもはっきり言って、
めちゃくちゃな文法であり、未熟さを感じています。
とりあえず基本をマスター出来るようにやっていきたいと思います。
また皆さんのお知恵を借りるかもしれませんが、叱咤激励お願いします。

以下 とりあえず動きました・・・ 
あと 転送率みたいな表示をさせたいのですが、どんな方法があるのでしょうか?



'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。


'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
tesuto1_DestroyObjects()
PostQuitMessage(0)
End Sub

Sub MainWnd_CommandButton1_Click()
Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (sAgent As BytePtr,_
lAccessType As Long,sProxyName As BytePtr,sProxyBypass As BytePtr,lFlags As Long) As Long
Declare Function InternetCloseHandle Lib "wininet.dll" (hInet As Long) As Integer
Declare Function InternetConnect Lib "wininet" Alias "InternetConnectA" (Session As Long, ServerName As String,_
Port As Long, UserName As String, Password As String, Service As Long, Flags As Long, Context As Long) As Long
Declare Function FtpGetFile Lib "wininet" Alias "FtpGetFileA" (hFtp As Long, RemoteFile As String, NewFile As String,_
Faill As Long, Flags As Long, InternetF As Long, Context As Long) As Long
Declare Function FtpPutFile Lib "WinInet.DLL" Alias "FtpPutFileA" (hFtpSession As Long,lpszLocalFile As String,_
lpszNewRemoteFile As String,dwFlags As Long,dwContext As Long) As Long

Const INTERNET_OPEN_TYPE_PRECONFIG=0 'IEの設定で接続
Const INTERNET_OPEN_TYPE_DIRECT=1 '直接接続します
Const INTERNET_OPEN_TYPE_PROXY=3 'プロキシ経由で接続します
Const INTERNET_DEFAULT_FTP_PORT=21 'ftpポートです
Const INTERNET_DEFAULT_HTTP_PORT=80 'httpポートです
Const INTERNET_DEFAULT_HTTPS_PORT=443 'httpsポートです
Const INTERNET_SERVICE_FTP=1 'ftpを要求
Const INTERNET_SERVICE_HTTP=3 'httpを要求
Const INTERNET_FLAG_RELOAD=&H80000000 'キャッシュを使用しません
Const FTP_TRANSFER_TYPE_BINARY=&H2 'バイナリモードで受信します

Dim open As Long
Dim ftp As Long
Dim Aa As String
Dim hEdit As Long
Dim length As DWord
Dim sGroup as String
Dim sGroup1 as String

'EditBox2のハンドルを取得
hEdit=GetDlgItem(hMainWnd, EditBox2)
'テキスト データを格納するためのバッファ領域を確保
length=GetWindowTextLength(hEdit)
sGroup=ZeroString(length+1)
'テキスト バッファを取得
GetWindowText(hEdit, sGroup, length+1)

'EditBox1のハンドルを取得
hEdit=GetDlgItem(hMainWnd, EditBox1)
'テキスト データを格納するためのバッファ領域を確保
length=GetWindowTextLength(hEdit)
sGroup1=ZeroString(length+1)
'テキスト バッファを取得
GetWindowText(hEdit, sGroup1, length+1)



open=InternetOpen(0,0,0,0,0)
ftp=InternetConnect(open,"1**.1**.0.1**",21,"anonymous","user",INTERNET_SERVICE_FTP,0,0)
If ftp=0 Then MsgBox 0,"エラー","",MB_OK:End

sGroup1="C:\My Documents\新しいフォルダ"+sGroup1

FtpPutFile(ftp,sGroup1,sGroup,FTP_TRANSFER_TYPE_BINARY,0)

InternetCloseHandle(ftp)
InternetCloseHandle(open)
End Sub


Sub MainWnd_CommandButton4_Click()

SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_RESETCONTENT,0,0)

Dim strSearch As String '検索ファイル名を格納
Dim FileProp As WIN32_FIND_DATA '検索結果を格納
Dim FindHandle As DWord '検索ハンドルを格納

strSearch = "C:\My Documents\新しいフォルダ\*.*"

'最初の検索をかける
FindHandle = FindFirstFile(strSearch,FileProp)

'もし、ファイルが見つからない場合は、Exit Sub
If FindHandle = INVALID_HANDLE_VALUE Then Exit Sub

'1つでも見つかった場合はループで1つ1つファイル情報を取得し
'リストボックスへ代入する

Do

'もし、取得したファイルの属性が「ディレクトリ以外」なら
'リストボックスへファイル名を追加
If FileProp.dwFileAttributes <> FILE_ATTRIBUTE_DIRECTORY Then

SendMessage(GetDlgItem(hMainWnd,ListBox1),LB_ADDSTRING,0,FileProp.cFileName)

End If

'FindNextFile関数の戻り値がFALSEになるまでループ
Loop While FindNextFile(FindHandle,FileProp) = TRUE

'検索ハンドルをクローズ
FindClose(FindHandle)

End Sub



Sub MainWnd_CommandButton3_Click()
SendMessage(hMainWnd,WM_CLOSE,0,0)
End Sub



Dim hList As Long
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
hList=GetDlgItem(hMainWnd,ListBox1)
End Sub



Sub MainWnd_ListBox1_DblClick()
Dim num As Long
Dim buf As String
buf=ZeroString(40)
'選択位置を取得
num=SendMessage(hList,LB_GETCURSEL,0,0)
'文字列を取得
SendMessage(hList,LB_GETTEXT,num,StrPtr(buf))
'EditBoxの内容を更新
SetDlgItemText(hMainWnd,EditBox1,buf)
SetDlgItemText(hMainWnd,EditBox2,buf)
End Sub



Sub MainWnd_CommandButton2_Click()

Dim buf As String
buf=ZeroString(40)

'文字列を取得
SendMessage(hList,LB_GETTEXT,"",StrPtr(buf))
'EditBoxの内容を更新
SetDlgItemText(hMainWnd,EditBox1,buf)
SetDlgItemText(hMainWnd,EditBox2,buf)
End Sub
返信する