应用需求:

        用户在选择渲染作业时面临两种情况:一是选择用户远程存储上的文件;二是选择本地文件系统中的文件进行渲染。由于渲染任务是在远程主机上进行的,实际进行渲染时源文件也是在ftp目录中获取的,因此当用户选择本地文件系统中的文件时,文件必须上传到ftp上的指定目录中,远程主机才能正确获取到文件的路径,下载后进行文件渲染,然后将渲染结果保存在ftp的指定路径下。因此,需求就是当用户选择本地文件系统中的文件时,文件要自动上传到ftp的目录中,供渲染程序调用执行。

解决方案分析:

原有Qftp的操作中存在文件上传的操作,但是利用qftp中的方式,上传文件不稳定,而且如果文件较大,很容易发生错误,因此才想着使用外部的Ftp工具实现文件的上传。

到这里我们已经明确,要实现上述目标需要解决以下两个问题:1)FileZilla上传文件的命令行形式。2)如何实现FileZilla静默上传,即不弹出窗口。

1)FileZilla上传文件的命令行形式。在解决这个问题的时候,费了一点时间。Google之后的确有使用命令行上传文件的相关信息,但是我在cmd下调用FileZilla.exe查看相关帮助,一直说命令不存在。经过一番周折看到一篇帖子,说命令的支持与FileZilla的版本有关,较高版本的FileZilla不支持文件上传的命令行形式。因此,又下载了较低版本的FileZilla,这里我使用的是2.2.17版本。使用方式如下:

OK,第一个问题解决,但它还不太完美,因为到调用的时候总是弹出窗口,虽然在上述命令的最后加上"-close",在文件上传结束后,窗口会自动关闭,但这会严重影响用户的使用体验,那么就集中解决这个问题吧。

2)如何实现FileZilla静默上传,即不弹出窗口

刚开始解决这个问题时,一直在找它的命令行中是否相关参数能够实现静默上传,但是很遗憾,没有找到。甚至还想到了修改FileZilla的源码,反正它也是开源的。但是后来一想,调用它要采用CreateProcess创建一个新的进程的方式,以前有些印象通过CreateProcess设置某些参数可以不显示子进程的窗口。通过查阅相关资料,bingo,方案可行。相关代码如下:

  1. void LHGoldenfarmClientPrivate::StartProcessDownloadFiles(const QStringList downloadFiles)
  2. {
  3. int file_count = downloadFiles.size();
  4. HANDLE *file_handles = (HANDLE *)malloc(file_count*sizeof(HANDLE)) ;
  5. for(int i = 0 ; i < downloadFiles.size() ; i++)
  6. {
  7. QFileInfo files(downloadFiles.at(i));
  8. if(files.exists()){
  9. STARTUPINFO si = {sizeof(si)};
  10. PROCESS_INFORMATION pi ;
  11. si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
  12. si.wShowWindow = SW_HIDE;
  13. QString ftpHost ;
  14. QString ftpUser ;
  15. QString ftpPass ;
  16. LHGoldenfarmClientPrivate::Mgr->GetFtpCredentials(ftpHost , ftpUser , ftpPass);
  17. QString filepath = files.absoluteFilePath().replace("/","\\");
  18. QString filename = files.fileName();
  19. QString filesuffix = files.suffix();
  20. QString destdir = QString("scene_Files") ;
  21. QString s_cmdline = QString("FileZilla//filezilla.exe -r -u %1 ftp://%2:%3@%4/%5 -t %6 -close").arg(filepath.toLatin1().data()
  22. ).arg(ftpUser.toLatin1().data()).arg(ftpPass.toLatin1().data()).arg(ftpHost.toLatin1().data()).arg(
  23. destdir.toLatin1().data()).arg(filename.toLatin1().data());
  24. qDebug() << s_cmdline.toLatin1().data();
  25. //! 完成多字节到宽字节的转换
  26. WCHAR *w_cmdline = ConvertFromCharToWchar(s_cmdline.toLatin1().data());
  27. BOOL bRet = ::CreateProcess(
  28. NULL ,
  29. w_cmdline ,
  30. NULL,
  31. NULL,
  32. FALSE,
  33. CREATE_NO_WINDOW,
  34. NULL,
  35. NULL,
  36. &si,
  37. &pi
  38. );
  39. if(bRet){
  40. file_handles[i] = pi.hThread;
  41. }
  42. }
  43. }
  44. WaitForMultipleObjects(file_count , file_handles , TRUE , 3 * 60 *1000);
  45. }

这里主要要同时设置:si.wShowWindow = SW_HIDE以及CreateProcess中的CRATE_NO_WINDOW参数才可以。好了,运行一下,嗯,不过,文件正确上传;再运行一下,怎么会弹出窗口?原来是文件已经存在了,在这种情况下,会弹出窗口询问你如何操作,这里采用-r的命令行可以设置默认直接覆盖,话说这个参数还是自己猜出来的,我是有多么伟大。

总结:

这篇文章大部分为技术性的,而非思路上的拓展。但是这里要提的一点是,在解决第二个问题的时候,花的时间不太久,但是已近超过了我的预期。而且想起这个方法来,也是不经意间就想起来了。因为以前用过这种方式,不知道为嘛第一时间没有想起这个方法来,看来还是知识掌握的不够牢固,缺乏灵活运用。不过倒也符合我现在看书对自己的要求,不要试图记一些东西,只要能在脑子里留一点点印象就足够了,将来碰到问题的时候,能有印象知道应该向哪个方向查找,或许这就是我说的思路。

珍惜时间。时间这么紧张,真心不想大把大把的把时间浪费在无用的事情上,因为------我是有野心的。

FileZilla命令行实现文件上传以及CreateProcess实现静默调用的更多相关文章

  1. 在linux命令行利用SecureCRT上传下载文件

    一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地?与ssh有关的 ...

  2. Linux系统下安装rz/sz命令及使用说明(文件上传下载)

    1.安装软件 yum -y install lrzsz 2.本地文件上传命令 rz -bye 执行该命令后,在弹出框中选择要上传的文件即可 3.下载文件到本地 sz filename

  3. web漏洞-命令执行、文件上传、XSS

    一.命令执行   1:什么是命令执行? 命令执行漏洞是指攻击者可以随意执行系统命令.属于高危漏洞之一任何脚本语言都可以调用操作系统命令. 应用有时需要调用一些执行系统命令的函数,举个例子如:PHP中的 ...

  4. PHP文件上传类(页面和调用部分)

    <!--upform.html内容--> <form action="upload.php" method="post" enctype=&q ...

  5. 【Selenium04篇】python+selenium实现Web自动化:文件上传,Cookie操作,调用 JavaScript,窗口截图

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第四篇博 ...

  6. CentOS命令行向OSS上传文件或文件夹

    下载地址:https://helpcdn.aliyun.com/document_detail/50452.html?spm=a2c4g.11186623.4.2.KyQak3 百度云盘:https: ...

  7. 远程文件传输命令•RHEL8/CentOS8文件上传下载-用例

    scp协议 scp [options] [本地用户名@IP地址:]file1 [远程用户名 @IP 地址 :] file2 options: -v 用来显示进度,可以用来查看连接,认证,或是配置错误. ...

  8. 如何用fir.im 命令行工具 打包上传

    1.注册fir.拿到token 2.安装 fir-cli 使用 Ruby 构建, 无需编译, 只要安装相应 gem 即可. $ ruby -v # > 1.9.3 $ gem install f ...

  9. 如何把本地文件上传至github?

    (都说git好用,但我觉得git把我弄得像个git……在反反复复用git bash的命令行上传失败了N次之后,终于可以用命令行把文件上传到GitHub了 这中间,还要感谢网络上的各种git教程!!!) ...

随机推荐

  1. DataGridView 改变行列颜色

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/3227351.html] 1 private void ChangBackColor() { ) ...

  2. OA学习笔记-009-岗位管理的CRUD

    一.分析 Action->Service->Dao CRUD有功能已经抽取到BaseDaoImpl中实现,所以RoleDaoImpl没有CRUD的代码,直接从BaseDaoImpl中继承 ...

  3. 单片机 C 语言模块化编程

    好的开始是成功的一半 通过上一章的学习,我想你已经掌握了如何在程序中释放CPU了.希望能够继续坚持下去.一个良好的开始是成功的一半.我们今天所做的一切都是为了在单片机编程上做的更好. 在谈论今天的主题 ...

  4. haskell Types 和 Typeclasses

    Algebraic Data Types 入门 在前面的章节中,我们谈了一些 Haskell 内置的类型和 Typeclass.而在本章中,我们将学习构造类型和 Typeclass 的方法. 我们已经 ...

  5. 栈的实现(JAVA)

    栈定义 栈(stack):是一种特殊的串行形式的数据结构,其特殊之处在于只允许在链接串行或者阵列的 一端进行插入.删除操作.其实现方式可以通过一维阵列和链接串行来实现. Tips:简单的来说栈其实也是 ...

  6. Phpwind v9.0 存储型xss跨站漏洞

    漏洞版本: Phpwind v9.0 漏洞描述: Phpwind专注于中小网站应用的整合和价值的发掘,我们认为,以社区为网站的基础,可以提供丰富的应用,满足人们获取信息.交流.娱乐.消费等生活需求.获 ...

  7. [洛谷U990]传递游戏(90分)

    [题目描述 Description] n个人在做传递物品的游戏,编号为1-n. 游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位:下一个人可以传递给未接过物品的任意一 ...

  8. Android项目开发全程(四)-- 将网络返回的json字符串轻松转换成listview列表

    前面几篇博文介绍了从项目搭建到获取网络字符串,对一个项目的前期整体工作进行了详细的介绍,本篇接着上篇介绍一下怎么样优雅将网络返回的json字符串轻松转换成listview列表. 先上图,看一下效果. ...

  9. JavaScript高级程序设计52.pdf

    表单脚本 表单的基础知识 在HTML中,表单是由<form>元素表示的,在Javascript对应的是HTMLFormElement类型,它继承自HTMLElement,因此具有与其他HT ...

  10. Python按行读文件对比

    1. 最基本的读文件方法: # File: readline-example-1.py   file = open("sample.txt")   while 1:     lin ...