运行CuteFTP生成的.vbs脚本上传完成后如何关闭连接避免文件锁定?
问题解答
上传完成后关闭连接的方法
你当前使用的UploadAsync是异步上传方法,调用后会立即返回不会等待上传完成,不能直接在调用后就关闭连接,需要先等待上传任务执行完毕再执行关闭操作,步骤如下:
- 调用
WaitForCompletion方法等待异步上传任务结束 - 调用
Close方法主动断开FTP连接 - 置空对象释放COM资源,避免残留连接占用
如果不主动关闭连接,除了会导致远端数据库文件被锁定无法读写引发网站崩溃之外,还会占用Godaddy主机的FTP连接数配额,达到上限后后续所有FTP请求都会被拒绝。
修改后的最小可用关闭逻辑代码如下:
' 原有代码保持不变 MySite.Connect MySite.UploadAsync "C:\Projects\access_db\propertyDB.mdb", "/access_db/propertyDB.mdb" ' 新增等待上传完成逻辑,参数0代表无限等待直到任务结束 MySite.WaitForCompletion 0 ' 主动关闭连接 MySite.Close ' 释放COM对象 Set MySite = Nothing
更优的实现方案
- 优先替换为同步上传:如果你的脚本是作为定时任务独立运行,无需并行处理其他任务,直接使用
Upload方法替代UploadAsync,不需要额外编写等待逻辑,执行完成后自动进入下一步,不会出现上传未完成就断开连接的问题 - 添加上传前备份逻辑:上传数据库前先将远端现有数据库文件重命名为带时间戳的备份文件,万一上传过程中断导致文件损坏,可以立刻回滚到旧版本,避免网站长时间不可用
- 更换为SFTP传输:FTP为明文传输协议,账号密码有被窃听的风险,Godaddy主机普遍支持SFTP协议,只需要将
Protocol参数改为SFTP、端口改为22即可大幅提升传输安全性 - 增加错误捕获机制:添加VBS原生错误捕获逻辑,连接失败、上传失败时自动触发回滚操作,避免异常场景下网站不可用
- 调整执行时间:将上传任务安排在网站访问低谷期执行,即使出现短暂的文件锁定也不会影响大量用户访问
- 长期优化建议:Access属于文件型数据库,天生不适合高并发生产场景,访问量上涨后建议替换为MySQL等数据库,从根源上避免文件锁定问题
优化后的完整脚本示例:
' Create TEConnection object Set MySite = CreateObject("CuteFTPPro.TEConnection") ' 开启错误捕获 On Error Resume Next ' 远程服务器配置 MySite.Host = "ftp.servername.here" ' 启用SFTP可替换为下方两行配置 ' MySite.Protocol = "SFTP" ' MySite.Port = 22 MySite.Protocol = "FTP" MySite.Port = 21 MySite.Retries = 30 MySite.Delay = 30 MySite.MaxConnections = 1 MySite.TransferType = "AUTO" MySite.DataChannel = "DEFAULT" MySite.AutoRename = "OFF" MySite.Login = "username" MySite.Password = "password" MySite.SocksInfo = "" MySite.ProxyInfo = "" ' 连接远程服务器 MySite.Connect If Err.Number <> 0 Then WScript.Echo "连接失败:" & Err.Description Err.Clear Set MySite = Nothing WScript.Quit 1 End If ' 备份远端现有数据库 backupName = "/access_db/propertyDB_backup_" & Year(Now) & Right("0"&Month(Now),2) & Right("0"&Day(Now),2) & Right("0"&Hour(Now),2) & ".mdb" MySite.Rename "/access_db/propertyDB.mdb", backupName ' 同步上传新数据库 MySite.Upload "C:\Projects\access_db\propertyDB.mdb", "/access_db/propertyDB.mdb" If Err.Number <> 0 Then WScript.Echo "上传失败,正在回滚:" & Err.Description ' 上传失败回滚旧版本 MySite.Rename backupName, "/access_db/propertyDB.mdb" Err.Clear retCode = 1 Else WScript.Echo "上传成功" retCode = 0 End If ' 关闭连接释放资源 MySite.Close Set MySite = Nothing On Error GoTo 0 WScript.Quit retCode
内容的提问来源于stack exchange,提问作者jay bee
相关产品推荐
相关产品推荐

