我尝试制作ftp上传器,自动创建子目录并将文件放入其中。
我的问题是:
我知道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();
}
答案 0 :(得分:1)
函数list()
异步工作。调用此函数后,它会立即返回唯一标识符。当命令启动时,此id传入commandStarted()
信号,当list命令完成时传入commandFinished()
信号。在这两个信号之间为每个找到的目录条目发出listInfo()
信号。
因此,在上传到目录之前,您必须检查从QUrlInfo
信号传递的所有listInfo()
个对象,直到commandFinished()
信号发出。