0

前提: WinInet FtpGetFile を使用して FTP 経由で Linux から Windows にファイルをコピーする。

目的: ファイルは ANSI として作成され、Unicode で必要とされます。

進行状況: 私が抱えている唯一の問題は、元のファイルの LF 文字を宛先ファイルの CRLF 文字にする必要があることです。
私が試してみました:

Public Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileW" (ByVal hFTP As Long, ByVal sRemoteFile As String, ByVal sNewFile As String, ByVal bFailIfExists As Boolean, ByVal lFlagsAndAttributes As Long, ByVal lFlags As Long, ByVal lContext As Long) As Boolean
Public Sub test(hConn as Long, strSrcPath as String, strDestPath as String)
  'All code works other than the file not converting to having CR chars
  ftpGetFile(hConn, StrConv(strSrcPath, vbUnicode), StrConv(strDestPath, vbUnicode), True, 0, 0, 0)
End Sub
  • (変換に失敗)FtpGetFileメソッド ( Alias FtpGetFileW) の Unicode バージョンを使用し、 を使用して引数を渡しますStrConv(<string>, vbUnicode)。ファイルは、行末に LF 文字のみで表示されます。
  • (WORKS、手動)WinSCPを使用してファイルを手動でコピーします。出力ファイルを自動的にユニコードにしますが、これに関連するメソッド/設定が見つかりません。WinSCP.dll を登録できないため、職場で使用できません。
  • (ゆっくりと動作します)回避策を使用します。のいずれかのバージョンを使用しますFtpGetFile。ファイルを開き、変数を読み取り、ファイルを閉じてから、書き込み用にファイルを開き、書き込みReplace(variable,Chr(10),Chr(13)&Chr(10))ます。また、ファイルのサイズが ~2 倍に見えます。

WinAPI 関数を使用してファイルを取得し、(可能であれば) 1 回で変換するにはどうすればよいですか?

関連記事:
FTP 転送後に Unicode が ANSI に変換さ
れる FTP 経由で ANSI 文字列を Unicode ファイルに書き込む

ソース情報:
FTP コンポーネントの作成方法 CodeGuru
MSDN for WinInet

4

2 に答える 2

1

以下は、ほぼ瞬時に機能しているようです。これを自動化する方法に関するより良い提案があれば (できればこの回避策なしで、または回避策を改善するために) 提供してください。それ以外の場合は、おそらく数日以内にこれを回答として選択することになります. ファイル全体を文字列として使用して吐き出すftpReadFileカスタム関数です。InternetReadFile

Public Function ftpGetFileToUnicode(hConn As Long, strFromPath As String, strDestPath As String) As Boolean
  Dim hFile As Long
  Dim objFS As New FileSystemObject, objFile As TextStream

  If Not objFS.FileExists(strDestPath) Then
      Set objFile = objFS.CreateTextFile(strDestPath, ForWriting)
      objFile.Write Replace(ftpReadFile(hConn, strFromPath), Chr(10), Chr(13) & Chr(10))
      objFile.Close

      If objFS.GetFile(strDestPath).Size > 0 Then
          ftpGetFileToUnicode = True
          Exit Function
      End If
  End If

  ftpGetFileToUnicode = False
End Function

注: ファイルが存在しない場合は、0 バイトのファイルを作成します。そうしないように簡単に変更できます。

于 2013-10-02T18:23:13.970 に答える