FTPサーバーのディレクトリ・ファイルを列挙          <TOP>


FTPサーバーにあるディレクトリ、ファイルを列挙します。

InternetOpen インターネットのハンドルを作成

InternetConnect インターネットサーバーに接続し、ハンドルを返す

InternetCloseHandle インターネット関数のハンドルをクローズ

FtpFindFirstFile 指定したファイル名に一致するファイルやディレクトリを検索

InternetFindNextFile 検出したファイルの次を検出

 

例では、geocitiesのFTPサーバーにあるディレクトリおよびファイルを列挙しています。当然ユーザー名とパスワードは本物を入力します。

ファイルの種類は、すべてのファイルおよびwavファイルの列挙例です。

 

'================================================================
'= FTPサーバーのディレクトリ・ファイルを列挙
'=    (FtpFindFirstFile.bas)
'================================================================
#include "Windows.bi"

' インターネットのハンドルの作成
Declare Function Api_InternetOpen& Lib "wininet" Alias "InternetOpenA" (ByVal sAgent$, ByVal lAccessType&, ByVal sProxyName$, ByVal sProxyBypass$, ByVal lFlags&)

' インターネット上のサーバに接続し、ハンドルを返す
Declare Function Api_InternetConnect& Lib "wininet" Alias "InternetConnectA" (ByVal hSession&, ByVal sServerName$, ByVal nServerPort&, ByVal sUsername$, ByVal sPassword$, ByVal lService&, ByVal lFlags&, ByVal lContext&)

' Win32インターネット関数のハンドルのクローズ
Declare Function Api_InternetCloseHandle% Lib "wininet" Alias "InternetCloseHandle" (ByVal hInet&)

' 指定したファイル名に一致するファイルやディレクトリを検索
Declare Function Api_FtpFindFirstFile& Lib "wininet" Alias "FtpFindFirstFileA" (ByVal hConnect&, ByVal lpszSearchFile$, lpFindFileData As Any, ByVal dwFlags&, ByVal dwContext&)

' 検出したファイルの次を検出
Declare Function Api_InternetFindNextFile& Lib "wininet" Alias "InternetFindNextFileA" (ByVal hConnect&, lpFindFileData As Any)

Type FILETIME
    dwLowDateTime  As Long
    dwHighDateTime As Long
End Type

#define MAX_PATH 260

Type WIN32_FIND_DATA
    dwFileAttributes   As Long
    ftCreationTime     As FILETIME
    ftLastAccessTime   As FILETIME
    ftLastWriteTime    As FILETIME
    nFileSizeHigh      As Long
    nFileSizeLow       As Long
    dwReserved0        As Long
    dwReserved1        As Long
    cFileName          As String * MAX_PATH
    cAlternateFileName As String * 16
End Type

#define INTERNET_OPEN_TYPE_DIRECT 1      '直接接続
#define INTERNET_INVALID_PORT_NUMBER 0   '
#define INTERNET_SERVICE_FTP 1           'FTPを指定
#define INTERNET_FLAG_RELOAD -2147483648 'ローカルのキャッシュを無視し、常にサーバからデータを取得


Var Shared Edit(3) As Object
Var Shared Text(3) As Object
Var Shared List1 As Object
Var Shared Button1 As Object

For i = 0 To 3
    Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1)))
    Edit(i).SetFontSize 14
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1)))
    Text(i).SetFontSize 14
Next
List1.Attach GetDlgItem("List1") : List1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var wfd As WIN32_FIND_DATA
    Var hInet As Long
    Var hConnect As Long
    Var hFile As Long
    Var Ret As Long
    
    Button1.EnableWindow 0
    List1.Resetcontent

    '初期化
    hInet = Api_InternetOpen("", INTERNET_OPEN_TYPE_DIRECT, ByVal 0, ByVal 0, 0)

    SetMousePointer 2
    If hInet <> 0 Then
        'FTP接続処理
        hConnect = Api_InternetConnect(hInet, Edit(0).GetWindowText, INTERNET_INVALID_PORT_NUMBER, Edit(1).GetWindowText, Edit(2).GetWindowText, INTERNET_SERVICE_FTP, 0, 0)

        If hConnect <> 0 Then

            'FTPサーバーからファイルを検索
            hFile = Api_FtpFindFirstFile(hConnect, Edit(3).GetWindowText, wfd, INTERNET_FLAG_RELOAD, 0)

            Do
                '検索結果をリストボックスへ追加
                List1.AddString Left$(wfd.cFileName, InStr(wfd.cFileName, Chr$(0)) - 1)

                'ファイルの検索を継続
                Ret = Api_InternetFindNextFile(hFile, wfd)
            Loop Until Ret = 0
        End If
    End If

    SetMousePointer 0

    'ハンドルを閉じる
    If hInet <> 0 Then
        Ret = Api_InternetCloseHandle(hInet)
    End If

    If hConnect <> 0 Then
        Ret = Api_InternetCloseHandle(hConnect)
    End If

    If hConnect <> 0 Then
        Ret = Api_InternetCloseHandle(hFile)
    End If

    Button1.EnableWindow -1
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End