WinAPI FTPGetFile从ANSI到Unicode的转换

时间:2013-10-02 17:42:45

标签: vba winapi unicode ftp wininet

前提:使用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
  • (要转换的FAILS)使用Unicode版本的FtpGetFile方法(Alias FtpGetFileW),使用StrConv(<string>, vbUnicode)传递参数。这些文件在行尾只显示LF字符。
  • (WORKS,手动)使用WinSCP手动复制文件。它自动使输出文件Unicode,但我找不到与此相关的方法/设置。我无法在工作中使用WinSCP.dll,因为我无法注册。
  • (工作,慢慢地)使用解决方法。使用FtpGetFile的任一版本。打开文件,读取变量,关闭文件,然后打开文件进行写入,写入Replace(variable,Chr(10),Chr(13)&Chr(10))。此外,文件似乎是双倍大小。

如何使用WinAPI函数获取文件并一次性转换(如果可能)?

相关文章:
Unicode turns ANSI after FTP transfer
Writing ANSI string to Unicode file over FTP

来源信息:
How to Create FTP Components CodeGuru
MSDN for WinInet

2 个答案:

答案 0 :(得分: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字节的文件。可以很容易地改为不这样做。

答案 1 :(得分:0)

免责声明:我对VB一无所知。但是FtpGetFile says它支持ASCII模式传输,它具有隐式行结束转换:

ftpGetFile(hConn, StrConv(strSrcPath, vbUnicode), StrConv(strDestPath, vbUnicode),
           True, 0, FTP_TRANSFER_TYPE_ASCII, 0)