Диагностика сбоя QDir::rmdir

Я использую следующий код для удаления пустой папки в Linux:

bool removeFolder (const QString& path)
{
   QDir dir(path);
   assert(dir.exists());
   return dir.rmdir(".");
}

По некоторым причинам он иногда возвращает false (для определенных папок, но эти папки, похоже, ни в коем случае не ошибаются). Если я впоследствии использую::rmdir из <unistd.h> удалить ту же папку, это удается. Как я могу сказать, почему QDir::rmdir терпит неудачу?

Такого никогда не было в Windows, QDir::rmdir просто работает.

3 ответа

Подтверждаю: работает на windows, не работает на linux.

Читая документ «rmdir» в <unistd>, здесь https://pubs.opengroup.org/onlinepubs/007904875/functions/rmdir.html , там говорится, что « Если аргумент пути относится к пути, конечный компонент которого либо точка или точка-точка, rmdir() завершится ошибкой. " Так что, вероятно, происходит то, что QDir::rmdir() вызывает функцию unistd rmdir() в linux, а эта завершается ошибкой с ".".

Я попытался просто использовать полный абсолютный путь (QDir::rmdir(absolutePath)), и это сработало; тем не менее, я не вижу смысла в использовании QDir::rmdir() вместо rmdir() unistd, поэтому с этого момента я буду придерживаться unistd rmdir().

примечание: QDir::removeRecursively() — это совсем другая история: кажется, что это работает нормально, и это намного удобнее, чем переход через opendir(), а затем последовательные readdir() (или nftw(...FTW_DEPTH... ) штучка).

У меня была такая же проблема, но в Windows я не мог удалить пустой каталог с QDir().rmdir(path);, Это произошло на более старом жестком диске, так что, возможно, виновата была древняя файловая система. Но я нашел взломать

QFile(path).setPermissions(QFile::WriteOther); // this works even for dirs
bool success = QDir().rmdir(path);

Конечно, вы должны вернуть разрешения обратно к исходным значениям, если удаление все равно не удалось, но это другая история.

Попробуйте использовать это:

dir.rmdir(dir.absolutePath())
Другие вопросы по тегам