Как преобразовать кодировку FTP в массив Getlisting строк? - PullRequest
0 голосов
/ 17 октября 2018

Я использую следующий код vb, чтобы получить список файлов в каталоге ftp и заполнить его таблицей базы данных для использования в другом процессе интеграции.Пожалуйста, прости мои плохие плохие навыки программирования (я не разработчик vb.net).

Public Sub Main()

    Dim StrFolderArrary As String() = Nothing
    Dim StrFileArray As String() = Nothing
    Dim fileName As String
    Dim RemotePath As String

    RemotePath = Dts.Variables("User::FTPFullPath").Value.ToString()

    Dim ADODBConnection As SqlClient.SqlConnection
    ADODBConnection = DirectCast(Dts.Connections("DB_Connection").AcquireConnection(Dts.Transaction), SqlClient.SqlConnection)
    Dim cm As ConnectionManager = Dts.Connections("FTP_Connection") 'FTP connection manager name
    Dim ftp As FtpClientConnection = New FtpClientConnection(cm.AcquireConnection(Nothing))

    ftp.Connect() 'Connecting to FTP Server

    ftp.SetWorkingDirectory(RemotePath) 'Provide the Directory on which you are working on FTP Server
    ftp.GetListing(StrFolderArrary, StrFileArray) 'Get all the files and Folders List


    'If there is no file in the folder, strFile Arry will contain nothing, so close the connection.
    If StrFileArray Is Nothing Then
        ftp.Close()

        'If Files are there, Loop through the StrFileArray arrary and insert into table
    Else
        For Each fileName In StrFileArray
            'MessageBox.Show(fileName)
            Dim SQLCommandText As String
            SQLCommandText = "INSERT INTO dbo._FTPFileList ([DirName],[FileName]) VALUES (N'" + RemotePath + "', N'" + fileName + "')"
            'MessageBox.Show(SQLCommandText)
            Dim cmdDatabase As SqlCommand = New SqlCommand(SQLCommandText, ADODBConnection)
            cmdDatabase.ExecuteNonQuery()
        Next
        ftp.Close()
    End If
    ' Add your code here
    '
    Dts.TaskResult = ScriptResults.Success
End Sub

Работает нормально, и я получаю результаты в таблице базы данных.Проблема заключается в том, что кодирование строк, поступающих с FTP, приводит к тому, что имена файлов с ударением пишутся неправильно, как показано в примере ниже.

таблица базы данных

Правильное имя файла - Razão, и я знаю, что сопоставление БД правильное, поскольку его можно записать так.

Поэтому я попытался преобразовать строки, используя этот код для каждого имени файла в массиве строк, но безуспешно.

For Each fileName In StrFileArray

    Dim utf8 As UTF8Encoding = New UTF8Encoding(True, True)
    Dim bytes As Byte() = New Byte(utf8.GetByteCount(fileName) + utf8.GetPreamble().Length - 1) {}
    Array.Copy(utf8.GetPreamble(), bytes, utf8.GetPreamble().Length)
    utf8.GetBytes(fileName, 0, fileName.Length, bytes, utf8.GetPreamble().Length)
    Dim fileName2 As String = utf8.GetString(bytes, 0, bytes.Length)

Я полагаю, что это идет с другой кодировкой со стороны FTP, поэтому я хотел бы знать, как преобразовать строки во время метода GetListing.

Или у вас есть идеи, как с этим справиться?

Заранее спасибо.

edit: я также безуспешно пробовал следующий код.

Dim utf8 As Encoding = Encoding.UTF8
Dim w1252 As Encoding = Encoding.GetEncoding(1252)
Dim w1252Bytes As Byte() = w1252.GetBytes(fileName)
Dim utf8Bytes As Byte() = Encoding.Convert(w1252, utf8, w1252Bytes)
Dim utf8Chars As Char() = New Char(utf8.GetCharCount(utf8Bytes, 0, utf8Bytes.Length) - 1) {}
utf8.GetChars(utf8Bytes, 0, utf8Bytes.Length, utf8Chars, 0)
Dim fileName2 As String = New String(utf8Chars)
...