MCPcopy Create free account
hub / github.com/KangLin/RabbitRemoteControl / RemoveDir

Method RemoveDir

Plugins/FileTransfer/ChannelSFTP.cpp:216–276  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

214}
215
216int 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;

Callers 2

eventMethod · 0.45
slotTreeRemoteDeleteMethod · 0.45

Calls

no outgoing calls

Tested by

no test coverage detected