トップ  >  サンプルソース  >  FTPの漢字ファイル名(VB.NET)

FTPの漢字ファイル名(VB.NET)

2010年01月02日

FTP(File Transfer Protocol)送受信のサンプル(VB.NET)の一部をSJIS以外(EUC等)の全角文字コードのファイル名に対応するように改造しました。WININET(IE)の漢字ファイル名対応です。FTP漢字ファイル名のコード変換には NonCodeNet.dll を使用しています。FTP漢字ファイル名のコード判定を自動的に行なう事も考えましたが、文字数が少なすぎて無理だと思います。

' FTPサーバのファイル名の文字コード変換対応--↓↓----------
' NonCodeNet.dllを参照設定しています。
Private Structure WIN32_FIND_DATA2
    Public dwFileAttributes As Integer
    Public ftCreationTime As FILETIME
    Public ftLastAccessTime As FILETIME
    Public ftLastWriteTime As FILETIME
    Public nFileSizeHigh As Integer
    Public nFileSizeLow As Integer
    Public dwReserved0 As Integer
    Public dwReserved1 As Integer
    <MarshalAs(UnmanagedType.ByValArray, _
        SizeConst:=MAX_PATH)> Public cFileName As Byte()
    <MarshalAs(UnmanagedType.ByValArray, _
        SizeConst:=14)> Public cAlternate As Byte()
End Structure

Private Declare Function FtpFindFirstFile Lib _
    "wininet.dll" Alias "FtpFindFirstFileA" ( _
    ByVal hFtpSession As Integer, _
    ByVal lpszSearchFile As String, _
    ByRef lpFindFileData As WIN32_FIND_DATA2, _
    ByVal dwFlags As Integer, _
    ByVal dwContent As Integer) As Integer

Private Declare Function InternetFindNextFile Lib _
    "wininet.dll" Alias "InternetFindNextFileA" ( _
    ByVal hFind As Integer, _
    ByRef lpvFindData As WIN32_FIND_DATA2) As Integer

' 文字コード変換オブジェクト
Private objNonCode As New NonCodeNet.NonCodeClass

' 関数名 : ChgFlNmCodeFromFtp
' 返り値 : 文字コード変換後のファイル名
' 引き数 : strPath : 文字コード変換前のファイル名
'         : FlNmCode : FTPファイル名の文字コード
' 機能説明 : FTPサーバのファイル名の文字コード変換
Private Function ChgFlNmCodeFromFtp( _
    ByRef filePath() As Byte, _
    ByVal FlNmCode As String) As String
    Dim strTmp As String
    If FlNmCode = "EUC" Then
        strTmp = objNonCode.EUC_To_VbUnicode(filePath)
    ElseIf FlNmCode = "JIS" Then
        strTmp = objNonCode.JIS_To_VbUnicode(filePath)
    ElseIf FlNmCode = "UTF8" Then
        strTmp = objNonCode.UTF8_To_VbUnicode(filePath)
    Else
        strTmp = objNonCode.SJIS_To_VbUnicode(filePath)
    End If
    ChgFlNmCodeFromFtp = strTmp
    If strTmp.IndexOf(New String(Chr(0), 1)) >= 0 Then
        ChgFlNmCodeFromFtp = strTmp.Substring(0, _
            strTmp.IndexOf(New String(Chr(0), 1)))
    End If
End Function

' 関数名 : FtpLs
' 返り値 : FTPのファイルやディレクトリの一覧
' 引き数 : strPath : サーバのファイルやディレクトリPATH
' 機能説明 : FTPサーバのディレクトリリスト取得
Public Function FtpLs(ByVal strPath As String) As String()
    On Error GoTo ErrHandler
    Dim strRtnVal() As String : ReDim strRtnVal(-1)
    FtpLs = strRtnVal

    ' FTPサーバ未接続の時はエラー
    If lngInternetOpen = 0 Then
        Err.Raise(9999, SourceFile, _
            "It is not connected to the ftp server.")
        Exit Function
    End If

    ' 必要なローカル変数定義
    Dim lngFirst As Long : lngFirst = 0
    Dim typData As WIN32_FIND_DATA2 = _
        New WIN32_FIND_DATA2
    typData.cFileName = New Byte(MAX_PATH - 1) {}
    typData.cAlternate = New Byte(14 - 1) {}
    Dim lngRtn As Long

    ' 最初のファイル名取得要求送信
    lngFirst = FtpFindFirstFile(lngInternetConnect, _
        strPath, typData, INTERNET_FLAG_RELOAD, 0)
    If lngFirst = 0 Then
        If Err.LastDllError <> ERROR_NO_MORE_FILES Then
            SetErrAndRaise(Err.LastDllError)
        End If
        Exit Function
    End If

    ' ファイル名の文字コード変換
    Dim strFileName As String
    strFileName = ChgFlNmCodeFromFtp( _
        typData.cFileName, "SJIS")

    ' 最初のファイル名取得
    ReDim strRtnVal(0)
    strRtnVal(UBound(strRtnVal)) = strFileName

    If (typData.dwFileAttributes And _
        FILE_ATTRIBUTE_DIRECTORY) = _
        FILE_ATTRIBUTE_DIRECTORY Then
        strRtnVal(UBound(strRtnVal)) = _
            strRtnVal(UBound(strRtnVal)) & "/"
    End If
    FtpLs = strRtnVal

    ' 2個目以降のファイル名取得要求送信
    Do
        lngRtn = InternetFindNextFile(lngFirst, typData)
        If lngRtn = 0 Then
            If Err.LastDllError <> ERROR_NO_MORE_FILES Then
                SetErrAndRaise(Err.LastDllError)
            End If
            Exit Do
        End If

        ' ファイル名の文字コード変換
        strFileName = ChgFlNmCodeFromFtp( _
            typData.cFileName, "SJIS")

        ' 2個目以降のファイル名取得
        ReDim Preserve strRtnVal(UBound(strRtnVal) + 1)
        strRtnVal(UBound(strRtnVal)) = strFileName

        If (typData.dwFileAttributes And _
            FILE_ATTRIBUTE_DIRECTORY) = _
            FILE_ATTRIBUTE_DIRECTORY Then
            strRtnVal(UBound(strRtnVal)) = _
                strRtnVal(UBound(strRtnVal)) & "/"
        End If
        FtpLs = strRtnVal
    Loop

    ' 最初のファイル名のハンドルクローズ
    InternetCloseHandle(lngFirst)
    Exit Function
ErrHandler:
    ErrorSave()
    If lngFirst <> 0 Then InternetCloseHandle(lngFirst)
    ErrorRaise()
End Function
' FTPサーバのファイル名の文字コード変換対応--↑↑----------
スポンサーサイト

テキストファイル比較(C#/VB.NET) | トップページへ戻る | 新年(2010)のごあいさつ

このページのトップに戻る

コメント

名前
題名
メールアドレス
WEBサイト
 
コメント
パスワード
  管理者にだけ表示を許可する

このページのトップに戻る

トラックバック

このページのトップに戻る