| 214 | } |
| 215 | |
| 216 | int CChannelSFTP::RemoveDir(const QString& dir) |
| 217 | { |
| 218 | if (!m_SessionSftp) |
| 219 | return SSH_FX_NO_CONNECTION; |
| 220 | |
| 221 | // 1. 打开目录 |
| 222 | sftp_dir sftpDir = sftp_opendir(m_SessionSftp, dir.toStdString().c_str()); |
| 223 | if (!sftpDir) { |
| 224 | qCritical(log) << "Failed to open directory for remove:" << dir; |
| 225 | // 如果打不开目录,尝试直接删除(可能是空目录或者文件) |
| 226 | int ret = sftp_rmdir(m_SessionSftp, dir.toStdString().c_str()); |
| 227 | if (ret == SSH_OK) { |
| 228 | qDebug(log) << "Removed directory (directly):" << dir; |
| 229 | return SSH_OK; |
| 230 | } else { |
| 231 | QString szErr = "Can't remove directory:" + dir + ssh_get_error(m_Session); |
| 232 | qCritical(log) << szErr; |
| 233 | emit sigError(ret, szErr); |
| 234 | return ret; |
| 235 | } |
| 236 | } |
| 237 | |
| 238 | // 2. 遍历目录内容 |
| 239 | sftp_attributes attr; |
| 240 | while ((attr = sftp_readdir(m_SessionSftp, sftpDir)) != NULL) { |
| 241 | QString name = QString::fromUtf8(attr->name); |
| 242 | if (name == "." || name == "..") { |
| 243 | sftp_attributes_free(attr); |
| 244 | continue; |
| 245 | } |
| 246 | QString fullPath = dir + "/" + name; |
| 247 | if (attr->type == SSH_FILEXFER_TYPE_DIRECTORY) { |
| 248 | // 递归删除子目录 |
| 249 | RemoveDir(fullPath); |
| 250 | } else { |
| 251 | // 删除文件 |
| 252 | int ret = sftp_unlink(m_SessionSftp, fullPath.toStdString().c_str()); |
| 253 | if (ret != SSH_OK) { |
| 254 | QString szErr = "Can't remove file:" + fullPath + ssh_get_error(m_Session); |
| 255 | qCritical(log) << szErr; |
| 256 | emit sigError(ret, szErr); |
| 257 | } else { |
| 258 | qDebug(log) << "Removed file:" << fullPath; |
| 259 | } |
| 260 | } |
| 261 | sftp_attributes_free(attr); |
| 262 | } |
| 263 | |
| 264 | sftp_closedir(sftpDir); |
| 265 | |
| 266 | // 3. 删除空目录 |
| 267 | int ret = sftp_rmdir(m_SessionSftp, dir.toStdString().c_str()); |
| 268 | if (ret != SSH_OK) { |
| 269 | QString szErr = "Can't remove directory:" + dir + ssh_get_error(m_Session); |
| 270 | qCritical(log) << szErr; |
| 271 | emit sigError(ret, szErr); |
| 272 | } else { |
| 273 | qDebug(log) << "Removed directory:" << dir; |
no outgoing calls
no test coverage detected