问题摘要:在需要调用命令文件时,尚未完成为FTP命令创建文本文件。它不会陷入"如果文件存在"。如何在继续代码之前确保创建文件?
详细信息:我正在处理Excel工作簿中的部分代码以FTP某些文件。为此,我通过包含FTP命令的代码创建FTPcmd.txt文件,关闭文件,然后在CMD窗口中炮制FTP命令。看起来命令文件花了太长时间才能完成写入,因此,我得到了一个" Permission Refused"错误。 FTP日志显示"错误打开脚本文件C:\ temp \ FTPcmd.txt。"我错误检查以查看文件是否存在,但我认为该文件在open语句后显示为现有,而不是关闭。我没有点击DIR<>""中的else语句。 IsFileOpen函数在"http://www.vbaexpress.com/kb/getarticle.php?kb_id=468 VBA Express : Excel - Check If a File Is Already Open"
上找到我不相信这是ShellWait问题。我需要该文件在之前写我调用Shell。
如果我手动单步操作,则在看到文件出现在目录中后,它会正常工作。
我还将FTP输出传输到一个文件并以类似方式将其重新读回来进行成功/失败消息传递,我也遇到了同样的问题。
有人有什么想法吗?提前谢谢!
Open temppath & "FTPcmd.txt" For Output As #2
Print #2, "user " & FSOUserName
Print #2, FSOpw
Print #2, "lcd " & temppath
Print #2, "cd public_html"
Print #2, "binary"
Print #2, "mput " & Chr(34) & "index.htm" & Chr(34)
Print #2, "cd .."
Print #2, "cd public_ftp"
Print #2, "mput " & Chr(34) & myfilename & Chr(34)
Print #2, "bye"
Close #2
Start = Timer
FTPlooper:
If Timer - Start > 30 Then saveme = 1: Text = Text & " FTP Failure": GoTo failpoint
If Dir(temppath & "FTPcmd.txt") <> "" And IsFileOpen(temppath & "FTPcmd.txt") = False Then
Shell "cmd /c ftp -n -i -g -s:" & temppath & "FtpCmd.txt " & FSOHostURL & ">" & temppath & "ftpout.txt 2>&1"
Else
GoTo FTPlooper
End If
这是我用来查看文件是否已打开的功能。
代码:
Function IsFileOpen(FileName As String)'http://www.vbaexpress.com/kb/getarticle.php?kb_id=468
Dim iFilenum As Long
Dim iErr As Long
On Error Resume Next
iFilenum = FreeFile()
Open FileName For Input Lock Read As #iFilenum
Close iFilenum
iErr = Err
On Error GoTo 0
Select Case iErr
Case 0: IsFileOpen = False
Case 70: IsFileOpen = True
Case Else: Error iErr
End Select
End Function
输出FTPout.txt:
打开脚本文件C:\ Users \ Theresa \ Downloads \ FTPcmd.txt。
时出错将文件传输到运行FTP服务器服务的计算机或从中传输文件 (有时称为守护进程)。 Ftp可以交互使用。
FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-A] [-x:sendbuffer] [-r:recvbuffer] [-b:asyncbuffers] [-w:windowsize] [host]
-v禁止显示远程服务器响应。 -n 在初始连接时禁止自动登录。 -i转 在多个文件中关闭交互式提示 传输。 -d启用调试。 -g禁用文件名通配(请参阅GLOB命令)。 -s:文件名
指定包含FTP命令的文本文件;该 FTP启动后会自动运行命令。 -a绑定数据连接时使用任何本地接口。 - 以匿名身份登录。 -x:send sockbuf覆盖默认的SO_SNDBUF大小8192. -r:recv sockbuf覆盖 默认SO_RCVBUF大小为8192. -b:async count覆盖 默认异步计数为3 -w:windowsize覆盖默认值 传输缓冲区大小为65535. host指定主机 遥控器的名称或IP地址 主机连接到。注意: - mget和mput命令取y / n / q表示是/否/退出。 - 使用Control-C中止命令。