前提:使用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
),使用StrConv(<string>, vbUnicode)
传递参数。这些文件在行尾只显示LF字符。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
答案 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)