如何使用QFtp::list和QFtp::listInfo来检查目录是否存在
how to use QFtp::list and QFtp::listInfo to check if directory exists
我尝试制作ftp上传器,它会自动创建子目录并将文件放入其中。
我的问题是:
- 如果目录已经存在,我的上传程序不会上传文件
- 它在下一个mkdir上失败(没有错误,只是它没有上传文件)
我知道QFtp有list()
和listInfo()
,但我不明白我应该如何在代码中使用。
以下是我如何实现我的上传程序:
ftp = new QFtp();
ftp->setTransferMode(QFtp::Passive);
ftp->connectToHost(g.ftp_host);
ftp->login(g.ftp_user,g.ftp_password);
ftp->list();
ftp->cd(g.ftp_defaultdir+g.phocadir);
for (int i = 0; i<FulluploadFilenames->size(); i++){
ftp->mkdir(_taj->at(i)); // should check if exists
ftp->cd(_taj->at(i));
ftp->mkdir(_year->at(i));
ftp->cd(_year->at(i));
ftp->mkdir(_month->at(i));
ftp->cd(_month->at(i));
qdata = new QFile(FulluploadFilenames->at(i),this);
if (qdata->open(QIODevice::ReadOnly)) {
ftp->put(qdata,uploadFilenames->at(i));
ftp->list();
}
ftp->cd("../");
ftp->cd("../");
ftp->cd("../");
}
ftp->close();
这个make和cd到类似的东西:/123123123/2015/05/
并在这里上传文件。
有人能帮忙检查一下目录是否存在吗?
更新:
我没有检查目录是否存在,而是强制mkdir同步工作,这样失败就无关紧要了。
void MainWindow::doUpload(){
ftp = new QFtp();
ftp->connectToHost(g.ftp_host);
ftp->login(g.ftp_user,g.ftp_password);
ftp->cd(g.ftp_defaultdir+g.phocadir);
ftp->list();
// making directories
for (int i = 0; i<FulluploadFilenames->size(); i++){
runCommand(ftp, ftp->mkdir(_taj->at(i)));
runCommand(ftp, ftp->mkdir(_taj->at(i)+"/"+_year->at(i)));
runCommand(ftp, ftp->mkdir(_taj->at(i)+"/"+_year->at(i)+"/"+_month->at(i)));
}
// uploading files
for (int i = 0; i<FulluploadFilenames->size(); i++){
ftp->cd(_taj->at(i)+"/"+_year->at(i)+"/"+_month->at(i));
qdata = new QFile(FulluploadFilenames->at(i),this);
if (qdata->open(QIODevice::ReadOnly)) {
ftp->put(qdata,uploadFilenames->at(i));
}
ftp->cd("../../../");
ui->progressBar->setValue(i+1);
ui->progressBar->update();
QCoreApplication::processEvents();
}
ftp->close();
}
void MainWindow::runCommand(QFtp *ftp, int commandId){
QEventLoop loop;
connect(ftp, SIGNAL(commandFinished(int, bool)), &loop, SLOT(quit()));
loop.exec();
}
函数list()
异步工作。调用此函数后,它会立即返回唯一标识符。当命令开始时,该id在commandStarted()
信号中传递,当列表命令结束时,该id在commandFinished()
信号中传递。在这两个信号之间,为找到的每个目录条目发射CCD_ 7信号。
所以在上传到目录之前,您必须检查所有QUrlInfo
对象,从listInfo()
信号传递到commandFinished()
信号发出。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 清除前检查矢量
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- C++LDAP检查用户是否是特定组的成员
- 检查TCHAR数组输入是否为带符号整数C++
- 如何使用QFtp::list和QFtp::listInfo来检查目录是否存在