首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用QFtp::list和QFtp::listInfo检查是否存在目录

如何使用QFtp::list和QFtp::listInfo检查是否存在目录
EN

Stack Overflow用户
提问于 2015-05-09 18:58:13
回答 1查看 1.7K关注 0票数 0

我试着做ftp上传,它会自动创建子目录,并将文件放入其中。

我的问题是:

  • 如果目录已经存在,我的上传器就不会上传文件。
  • 它在下一个mkdir上失败(没有错误,只是它没有上传文件)。

我知道QFtp有list()listInfo(),但我不知道该如何在代码中使用。

下面是我实现上传器的方法:

代码语言:javascript
复制
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();

这使和cd类似的东西:/123123123/2015/05/和上传文件在这里。

有人能帮我检查一下目录是否存在吗?

更新:

我没有检查目录是否存在,而是强迫mkdir同步工作,所以如果失败了也没关系。

代码语言:javascript
复制
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();
}

..。

代码语言:javascript
复制
void MainWindow::runCommand(QFtp *ftp, int commandId){
QEventLoop loop;
connect(ftp, SIGNAL(commandFinished(int, bool)), &loop, SLOT(quit()));
loop.exec();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-09 22:15:54

函数list()异步工作。调用此函数后,它立即返回唯一标识符。该id在命令启动时传递给commandStarted()信号,在列表命令完成时传入commandFinished()信号。在这两个信号之间,为找到的每个目录条目发出listInfo()信号。

因此,在上传到目录之前,您必须检查所有QUrlInfo对象,这些对象从listInfo()信号传递到发出commandFinished()信号为止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30143839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档