/* 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; }
bool SFTPChannel::updateLs() { int rc; if (mRequestState == Beginning) { mOperationHandle = libssh2_sftp_opendir(mHandle, mCurrentRequest->getPath().toUtf8()); if (mOperationHandle) mRequestState = Reading; else if ((rc = libssh2_session_last_errno(mSession->sessionHandle())) == LIBSSH2_ERROR_EAGAIN) return true; // try again else { criticalError(tr("Failed to open remote directory for reading: %1").arg(rc)); return false; } mResult.clear(); } if (mRequestState == Reading) { char buffer[1024]; LIBSSH2_SFTP_ATTRIBUTES attrs; rc = libssh2_sftp_readdir(mOperationHandle, buffer, sizeof(buffer), &attrs); if (rc == LIBSSH2_ERROR_EAGAIN) return true; // Try again else if (rc == 0) mRequestState = Finishing; else if (rc < 0) { criticalError(tr("Error while reading remote directory: %1").arg(rc)); return false; } else // Got a directory entry { // Skip hidden entries iff request says to if (mCurrentRequest->getIncludeHidden() || buffer[0] != '.') { // Can't determine if remote file is readable/writable, so report all as so. QString flags = "rw"; if (LIBSSH2_SFTP_S_ISDIR(attrs.permissions)) flags += 'd'; QVariantMap details; details.insert("f", flags); details.insert("s", attrs.filesize); details.insert("m", (qulonglong)attrs.mtime); mResult.insert(buffer, details); } } } if (mRequestState == Finishing) { rc = libssh2_sftp_closedir(mOperationHandle); if (rc == LIBSSH2_ERROR_EAGAIN) return true; else if (rc < 0) { criticalError(tr("Failed to cleanly close SFTP directory: %1").arg(rc)); return false; } // Success! Send a response and finish up. QVariantMap finalResult; finalResult.insert("entries", mResult); mCurrentRequest->triggerSuccess(finalResult); return false; } return true; }