Russian Qt Forum

Qt => Общие вопросы => Тема начата: OKTA от Июль 30, 2014, 10:10



Название: [РЕШЕНО] QFile FileError
Отправлено: OKTA от Июль 30, 2014, 10:10
Товарищи, пытаюсь вероломно удалить файл, но remove() возвращает false, а error() NoError, errorString() - Unknown error. Разве это человечно? Где справедливость?  ;D


Название: Re: QFile FileError
Отправлено: Пантер от Июль 30, 2014, 10:12
1. Покажи кот.
2. ОС?
3. Удаляется другими средствами?


Название: Re: QFile FileError
Отправлено: OKTA от Июль 30, 2014, 10:17
Удаляю без всяких хитростей. Ос - Win7. DeleteFileA так же ноль эмоций.

Вот весь код:
Код:
QFile file("D:/test/test.dll");
file.remove();
DeleteFileA("D:/test/test.dll");

Только сейчас попробовал - текстовые файлы удаляет норм  :o

Забыл скопипастить remove, пардон)


Название: Re: QFile FileError
Отправлено: Пантер от Июль 30, 2014, 10:18
Эм. А где удаление через QFile? Если в эксплорере удалить? Если удалить через статический метод QFile::remove?


Название: Re: QFile FileError
Отправлено: OKTA от Июль 30, 2014, 10:22
Кажется нашел проблему. Все проще - права..
Выдает QFlags(0x4|0x40|0x400|0x4000) - вроде как только чтение разрешено как раз.


Название: Re: QFile FileError
Отправлено: OKTA от Июль 30, 2014, 10:23
GetLastError - 0  >:(


Название: Re: QFile FileError
Отправлено: OKTA от Июль 30, 2014, 10:27
Выставил перед удалением file.setPermissions(QFile::WriteOther); и удалился как надо!


Название: Re: QFile FileError
Отправлено: Пантер от Июль 30, 2014, 10:27
Кажется нашел проблему. Все проще - права..
Выдает QFlags(0x4|0x40|0x400|0x4000) - вроде как только чтение разрешено как раз.
Права файла не имеют никакого отношения к возможности его удалить. За удаление отвечают права каталога, в котором находится файл.
Из эксплорера удалить можно его?


Название: Re: QFile FileError
Отправлено: Пантер от Июль 30, 2014, 10:29
Выставил перед удалением file.setPermissions(QFile::WriteOther); и удалился как надо!
Возможно, это косвенно помогло. Попробуй не создавать объекта:
Код
C++ (Qt)
QFile::remove ("D:/test/test.dll");
 


Название: Re: QFile FileError
Отправлено: OKTA от Июль 30, 2014, 10:36
Из эксплорера удаляется, статический метод не удаляет.

Нашел в http://technet.microsoft.com/en-us/library/bb727008.aspx следующее - If a user has full control over a folder, the user can delete files in the folder regardless of the permission on the files. Значит права файла тоже имеют отношение к удалению по всей видимости.

Но все равно непонятно. В Qt поставил права на изменение, а судя по таблице 13-4 в ссылке на technet, удаление возможно только при FullModify и Execute  ???


Название: Re: QFile FileError
Отправлено: Пантер от Июль 30, 2014, 10:45
Ты правильно перевел?
"Если пользователь имеет полный доступ к каталогу, пользователь может удалить файл независимо от прав доступа к файлу".


Название: Re: QFile FileError
Отправлено: Пантер от Июль 30, 2014, 10:46
Версия Кьюта какая?


Название: Re: QFile FileError
Отправлено: OKTA от Июль 30, 2014, 10:53
Ой точно, невнимательность..
Ну тогда это точно причина не в правах к папке, т.к. другой созданный в этой папке файл удаляется нормально, а во вкладке "безопасность" права у всех файлов одинаковые  ??? Ничего не понимаю  ???
Qt - 4.7.4


Название: Re: QFile FileError
Отправлено: Пантер от Июль 30, 2014, 10:55
Как вариант - кто-то держит этот файл. По логике, файл может быть открыт где-то еще в проге?
Может еще антивирь мешать.
Поискал на багктрекере, ничего такого не нашел.


Название: Re: QFile FileError
Отправлено: Alex Custov от Июль 30, 2014, 11:08
Кажется нашел проблему. Все проще - права..
Выдает QFlags(0x4|0x40|0x400|0x4000) - вроде как только чтение разрешено как раз.
Права файла не имеют никакого отношения к возможности его удалить. За удаление отвечают права каталога, в котором находится файл.

В винде read-only права имеют значение (в отличие от Linux). Не знаю, защита ли это на уровне ОС, или просто защита от дурака в DeleteFile(), но в документации чётко написано: "To delete a read-only file, first you must remove the read-only attribute" (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363915%28v=vs.85%29.aspx)


Название: Re: QFile FileError
Отправлено: Alex Custov от Июль 30, 2014, 11:11
Нашел в http://technet.microsoft.com/en-us/library/bb727008.aspx следующее - If a user has full control over a folder, the user can delete files in the folder regardless of the permission on the files. Значит права файла тоже имеют отношение к удалению по всей видимости.

Это документация для пользователя десктопа, методы API могу вести себя по-другому. Тот же эксплорер наверняка снимает read-only атрибут перед удалением.


Название: Re: QFile FileError
Отправлено: Пантер от Июль 30, 2014, 11:13
"If the file is a read-only file, the function fails with ERROR_ACCESS_DENIED." почему же тогда lastError вернуло 0?


Название: Re: QFile FileError
Отправлено: Пантер от Июль 30, 2014, 11:14
Масдай он такой масдай. :)
Тогда для винды нужно права все таки менять.


Название: Re: QFile FileError
Отправлено: Alex Custov от Июль 30, 2014, 11:19
"If the file is a read-only file, the function fails with ERROR_ACCESS_DENIED." почему же тогда lastError вернуло 0?

может оригинальный код не совсем такой как скопипащен сюда, либо бага в винде. У меня, например, нормально:

Код
C++ (Qt)
   BOOL f = DeleteFile(L"F:\\url.txt");
   qDebug() << f << GetLastError();

печатает
Цитировать
0 5
где 5 - ERROR_ACCESS_DENIED


Название: Re: QFile FileError
Отправлено: OKTA от Июль 30, 2014, 11:22
Нет, оригинальный код именно такой - лишнего ничего нет - в пустом проекте пытаюсь удалять.
Ну, раз надо снимать readOnly, то QFile::WriteOther видимо это и делает.


Название: Re: QFile FileError
Отправлено: Alex Custov от Июль 30, 2014, 11:24
Я тут подумал что вероятно это баг всё-таки в Qt, если он error() возвращает как NoError. Попробуй на 4.8.6.


Название: Re: QFile FileError
Отправлено: OKTA от Июль 30, 2014, 11:34
Как появится под рукой - попробую!
Всем спасибо!