/* sftp获取文件列表 */ static int sftp_get_list(protocol_data_t *protocol, char **filelist, int *filecounts) { #define MALLOC_NUM 10 if (protocol == NULL || protocol->protocol_data == NULL) { return; } int rc; int allocnum; int blocksize; LIBSSH2_SFTP_ATTRIBUTES attrs; int reallocnum; sftp_data_t *data = (sftp_data_t *)protocol->protocol_data; blocksize = sizeof(file_t); *filelist = (char *)malloc(blocksize * MALLOC_NUM); if (*filelist == NULL) { return -2; } allocnum = MALLOC_NUM; reallocnum = MALLOC_NUM; *filecounts = 0; do { char filename[MAX_FILENAME_LEN] = {0}; /*255是文件名最大长度*/ /* filename存储文件和文件夹名 */ rc = libssh2_sftp_readdir_ex(data->dir_handle, filename, sizeof(filename), NULL, 0, &attrs); if(rc > 0) { if (filename[0] != '\0' && filename[0] != '.') {/*略去隐藏文件*/ /* 文件夹 或者 普通文件*/ if(LIBSSH2_SFTP_S_ISDIR(attrs.permissions) || LIBSSH2_SFTP_S_ISREG(attrs.permissions)) { if (*filecounts >= allocnum) { reallocnum = reallocnum + MALLOC_NUM; *filelist = (char *)realloc(*filelist, blocksize * reallocnum); if (*filelist == NULL) { return -2; } allocnum = allocnum + MALLOC_NUM; } memcpy(*filelist + *filecounts * blocksize, filename, MAX_FILENAME_LEN); memcpy(*filelist + *filecounts * blocksize + MAX_FILENAME_LEN, (char *)&attrs + sizeof(unsigned long), blocksize - MAX_FILENAME_LEN); *filecounts += 1; } } } else if (rc == 0) { return 0; } else { return -1; } } while (1); return 0; }
static void attr2urlinfo(QUrlInfo *urlInfo, const QString &name, LIBSSH2_SFTP_ATTRIBUTES *sftp_attr) { urlInfo->setName(name); urlInfo->setSymLink(LIBSSH2_SFTP_S_ISLNK(sftp_attr->permissions)); urlInfo->setFile(LIBSSH2_SFTP_S_ISREG(sftp_attr->permissions)); urlInfo->setDir(LIBSSH2_SFTP_S_ISDIR(sftp_attr->permissions)); QDateTime dt(QDateTime::fromString("1970-01-01 00:00:00", "yyyy-MM-dd HH:mm:ss")); urlInfo->setLastModified(dt.addSecs(sftp_attr->mtime)); urlInfo->setLastRead(dt.addSecs(sftp_attr->atime)); urlInfo->setSize(sftp_attr->filesize); int p = 0; if (sftp_attr->permissions & LIBSSH2_SFTP_S_IRUSR) p |= QFile::ReadUser | QFile::ReadOwner; if (sftp_attr->permissions & LIBSSH2_SFTP_S_IWUSR) p |= QFile::WriteUser | QFile::WriteOwner; if (sftp_attr->permissions & LIBSSH2_SFTP_S_IXUSR) p |= QFile::ExeUser | QFile::ExeOwner; if (sftp_attr->permissions & LIBSSH2_SFTP_S_IRGRP) p |= QFile::ReadGroup; if (sftp_attr->permissions & LIBSSH2_SFTP_S_IWGRP) p |= QFile::WriteGroup; if (sftp_attr->permissions & LIBSSH2_SFTP_S_IXGRP) p |= QFile::ExeGroup; if (sftp_attr->permissions & LIBSSH2_SFTP_S_IROTH) p |= QFile::ReadOther; if (sftp_attr->permissions & LIBSSH2_SFTP_S_IWOTH) p |= QFile::WriteOther; if (sftp_attr->permissions & LIBSSH2_SFTP_S_IXOTH) p |= QFile::ExeOther; urlInfo->setPermissions(p); urlInfo->setReadable(p & (LIBSSH2_SFTP_S_IRUSR | LIBSSH2_SFTP_S_IROTH)); urlInfo->setWritable(p & (LIBSSH2_SFTP_S_IWUSR | LIBSSH2_SFTP_S_IWOTH)); // TODO // urlInfo->setGroup(); // urlInfo->setOwner(); }
/* sftp删除文件夹 */ static int sftp_rm_dir(protocol_data_t *protocol, char *dirname) { int rc; LIBSSH2_SFTP_ATTRIBUTES attrs; LIBSSH2_SFTP_HANDLE *dir_handle; char source[MAX_PATH_LEN] = {0}; if (protocol == NULL || protocol->protocol_data == NULL || dirname == NULL) { return -1; } sftp_data_t *data = (sftp_data_t *)protocol->protocol_data; strcpy(source, dirname); dir_handle = libssh2_sftp_opendir(data->sftp_session, source); if (!dir_handle) { return -1; } do { char filename[MAX_FILENAME_LEN] = {0}; /*255是文件名最大长度*/ rc = libssh2_sftp_readdir_ex(dir_handle, filename, sizeof(filename), NULL, 0, &attrs); if(rc > 0) { if (filename[0] != '\0' && filename[0] != '.') {/*略去隐藏文件*/ if (LIBSSH2_SFTP_S_ISREG(attrs.permissions)) { add_lastfilename(source, filename); libssh2_sftp_unlink(data->sftp_session, source); del_lastfilename(source); } if(LIBSSH2_SFTP_S_ISDIR(attrs.permissions)){ add_lastdirname(source, filename); sftp_rm_dir(protocol, source); del_lastdirname(source); } } } else if (rc == 0) { break; } else { continue; } } while (1); libssh2_sftp_closedir(dir_handle); libssh2_sftp_rmdir(data->sftp_session, source); return 0; }