gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:16:39 26 4
gpt4 key购买 nike

我尝试制作自动创建子目录并将文件放入其中的 ftp uploader 。

我的问题是:

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

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

这是我实现 uploader 的方式:

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() 信号中传递,在列表命令完成时在 commandFinished() 信号中传递。在这两个信号之间 listInfo() 信号为找到的每个目录条目发出。

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

关于c++ - 如何使用 QFtp::list 和 QFtp::listInfo 检查目录是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30143839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com