WinAPI FTPGetFile 从 ANSI 到 Unicode 的转换

Posted

技术标签:

【中文标题】WinAPI FTPGetFile 从 ANSI 到 Unicode 的转换【英文标题】:WinAPI FTPGetFile Conversion From ANSI to Unicode 【发布时间】:2013-10-02 17:42:44 【问题描述】:

前提:使用 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
(转换失败)使用 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 CodeGuruMSDN for WinInet

【问题讨论】:

Also, files appear to ~double in size. 我刚刚想通了。由于这种保存字符的方法,Unicode (UTF16) 文件使用了大约两倍的字节数。有关更多信息,请参阅此帖子:***.com/a/700221/2497009 【参考方案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 字节的文件。可以很容易地更改为不这样做。

【讨论】:

【参考方案2】:

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

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

【讨论】:

感谢您的回复。我尝试使用两个 FtpGetFile 别名,它似乎没有添加回车符。我忘了在原始帖子中提到我尝试使用此标志。我正在使用 Notepad++ 'Show All' 视图选项检查字符。

以上是关于WinAPI FTPGetFile 从 ANSI 到 Unicode 的转换的主要内容,如果未能解决你的问题,请参考以下文章

FtpGetFile函数下载不到最新文件Solution

需要 FtpGetFile 的示例,不工作

FtpGetFile WinINet 永远不会返回

(72)C#里怎么样调用WIN API的函数

C语言如何用FtpPutFile()函数上传文件到Ftp服务器!下载用FtpGetFile()可以!

你好,这个你解决了吗?C语言如何用FtpPutFile()函数上传文件到Ftp服务器!下载用FtpGetFile()可以!