1、递归获取要上传的文件夹及其子文件的文件名
需要上传的文件夹中包含有子文件、文件夹,可能存在多级目录,需要递归的获取全部文件的文件名,遇到文件夹就在再FTP服务端先创建文件夹。
获取文件名的函数代码
struct fileName_s
{
int d_type; /* the type of d_name 文件类型 */
char d_name [256]; /* file name (null-terminated) 文件名,最长255字符 */
int filesize;
};
struct fileName_s filename[128];
int g_filesum = 0; //要上传的文件总数
int g_file_index = 0; //当前上传的文件序号
int Ftp_Form::readFileList(char *basePath)
{
DIR *dir;
struct dirent *ptr;
char base[256];
if ((dir=opendir(basePath)) == NULL)
{
perror("Open dir error...");
return 0;
}
QFileInfo fileinfo;
while((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
continue;
QString file_dname = QString(QLatin1String(basePath))+"/"+QString(QLatin1String(ptr->d_name));
fileinfo =QFileInfo(file_dname);
if(fileinfo.isDir()) ///dir
{
memset(base,0,sizeof(base));
strcpy(base,basePath);
strcat(base,"/");
strcat(base,ptr->d_name);
memset(filename[g_filesum].d_name,0,sizeof(filename[g_filesum].d_name));
sprintf(filename[g_filesum].d_name,"%s/%s",basePath,ptr->d_name);
QString dirpath = file_dname.right(file_dname.length()- ui->lineEdit_file->text().length()-1);
qDebug()<<"dirpath="<<dirpath;
PFtp->mkdir(dirpath); //在FTP服务端创建该文件夹
readFileList(base); //递归调用
}
else ///file
{
memset(filename[g_filesum].d_name,0,sizeof(filename[g_filesum].d_name));
sprintf(filename[g_filesum].d_name,"%s/%s",basePath,ptr->d_name);
filename[g_filesum].d_type=0;
g_filesum++; //统计总文件个数
}
}
closedir(dir);
return g_filesum;
}
2、上传文件
先登录
bool Ftp_Form::initFTP()
{
// 判断有没有填写URL地址和用户名、密码
if (ui->lineEdit_ftp->text().isEmpty()) {
QMessageBox::critical(NULL, tr("Error"), "URL地址不能为空");
return false;
}
else if (ui->lineEdit_user->text().isEmpty()) {
QMessageBox::critical(NULL, tr("Error"), "user不能为空");
return false;
}
else if (ui->lineEdit_user->text().isEmpty()) {
QMessageBox::critical(NULL, tr("Error"), "密码不能为空");
return false;
}
else {
ftpPath = ui->lineEdit_ftp->text();
user = ui->lineEdit_user->text();
password = ui->lineEdit_password->text();
Port = ui->Port->text().toUShort();
return true;
}
}
void Ftp_Form::on_Btn_Login_clicked()
{
if (initFTP())
{
// 得到选择的文件的路径,保存在字符串链表中
if(ui->Btn_Login->text() == "注销")
{
PFtp->close();
ui->fileList->clear();
currentPath.clear();
ui->Btn_Login->setText(tr("登录"));
}
else if(ui->Btn_Login->text() == "登录")
{
PFtp->connectToHost(ftpPath,Port);
PFtp->login(user,password);
}
}
}
上传文件
void Ftp_Form::UpLoad_file()
{
if(g_file_index < g_filesum)
{
QString BasePath = ui->lineEdit_file->text();
QString filePath = QString(QLatin1String(filename[g_file_index].d_name));;
g_file_index++;
g_send_flag = 1;
QFileInfo fileinfo(filePath);
if(fileinfo.isDir())
{
fileName = filePath.right(filePath.length()-BasePath.length()-1);
qDebug()<<"fileName="<<fileName;
PFtp->mkdir(toSpecialEncoding(fileName));
return;
}
file = new QFile(filePath);
if(!file->open(QIODevice::ReadOnly))
{
delete file;
file = NULL;
ui->textEdit->append(tr("本地文件:%1打开失败!").arg(file->fileName()));
g_send_flag=0;
return;
}
fileName = filePath.right(filePath.length()-BasePath.length()-1);
PFtp->put(file,toSpecialEncoding(fileName));
}
else
{
g_file_index=0;
timer->stop();
ui->textEdit->append(tr("上传完成!"));
refreshed();
}