Russian Qt Forum

Qt => Общие вопросы => Тема начата: spectre71 от Апрель 30, 2010, 11:08



Название: Почему не работает фильтр QDir (QT 4.6.2, Windows XP)
Отправлено: spectre71 от Апрель 30, 2010, 11:08
fileview.exe - Deny на Read & Execute
Попытка его запустить соответственно выдает ошибку, здесь все хорошо.

Однако следующий код работает некорректно:
Код
C++ (Qt)
   QString Viewer = "";
   QDir AppDir = QDir(qApp->applicationDirPath());
   QStringList list;
   list << "fileview*";
   list = AppDir.entryList(list, QDir::Readable|QDir::Files|QDir::Executable);
   for(int i=0; i<list.count(); i++) {
     if(list[i] == "fileview" || list[i] == "fileview.exe") {
       Viewer = AppDir.absoluteFilePath(list[i]);
       break;
     }
   }
 

На выходе получаем путь Viewer - на fileview.exe.
Почему не трабатывают флаги QDir::Readable|QDir::Files|QDir::Executable


Название: Re: Почему не работает фильтр QDir (QT 4.6.2, Windows XP)
Отправлено: spectre71 от Апрель 30, 2010, 11:22
Все, вспомнил! Для винды надо так:

Код
C++ (Qt)
#ifdef Q_OS_WIN
extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
#endif  
 
...
...
 
   QString Viewer = "";
   QDir AppDir = QDir(qApp->applicationDirPath());
   QStringList list;
   list << "fileview*";
#ifdef Q_OS_WIN
 qt_ntfs_permission_lookup++;
#endif  
   list = AppDir.entryList(list, QDir::Readable|QDir::Files|QDir::Executable);
#ifdef Q_OS_WIN
 qt_ntfs_permission_lookup--;
#endif  
   for(int i=0; i<list.count(); i++) {
     if(list[i] == "fileview" || list[i] == "fileview.exe") {
       Viewer = AppDir.absoluteFilePath(list[i]);
       break;
     }
   }


Название: Re: Почему не работает фильтр QDir (QT 4.6.2, Windows XP)
Отправлено: ритт от Май 03, 2010, 20:26
именно!


Название: Re: Почему не работает фильтр QDir (QT 4.6.2, Windows XP)
Отправлено: blood_shadow от Август 27, 2010, 17:44
Для винды надо так:


Добрый день, у меня похожая проблема не работает фильтр
Код:
 QDir obj("D:/123");

    QString strList;
    QStringList Filter;
    Filter << "*.olp";

    foreach(QString str, obj.entryList(Filter, QDir::Files)){
        strList = str;
        strList.replace(QString("olp"), QString("olp9"));
        if (!obj.rename(str, strList)) cout << "False" << endl;
    }

если написать
Код:
 foreach(QString str, obj.entryList(QDir::Files)) 
'то работает, но только берет все файлы
может у вас есть решение, если оно представлено в вашем втором посте, объясните пожалуйста что делают эти дериктивы препроцессора
ОС Windows 7


Название: Re: Почему не работает фильтр QDir (QT 4.6.2, Windows XP)
Отправлено: merke от Август 27, 2010, 18:27
Note that Qt does not by default check for permissions on NTFS file systems, as this may decrease the performance of file handling considerably. It is possible to force permission checking on NTFS by including the following code in your source:
Код:
[b]
 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;[/b]

Permission checking is then turned on and off by incrementing and decrementing qt_ntfs_permission_lookup by 1.

Код:
[b] qt_ntfs_permission_lookup++; // turn checking on
 qt_ntfs_permission_lookup--; // turn it off again[/b]

The Permissions type is a typedef for QFlags<Permission>. It stores an OR combination of Permission values.


Название: Re: Почему не работает фильтр QDir (QT 4.6.2, Windows XP)
Отправлено: blood_shadow от Август 27, 2010, 18:54
Note that Qt does not by default check for permissions on NTFS file systems, as this may decrease the performance of file handling considerably. It is possible to force permission checking on NTFS by including the following code in your source:
Код:
[b]
 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;[/b]

Permission checking is then turned on and off by incrementing and decrementing qt_ntfs_permission_lookup by 1.

Код:
[b] qt_ntfs_permission_lookup++; // turn checking on
 qt_ntfs_permission_lookup--; // turn it off again[/b]

The Permissions type is a typedef for QFlags<Permission>. It stores an OR combination of Permission values.

Я так понимаю эти строки
Код:
#ifdef Q_OS_WIN
  qt_ntfs_permission_lookup++;
#endif 
    list = AppDir.entryList(list, QDir::Readable|QDir::Files|QDir::Executable);
#ifdef Q_OS_WIN
  qt_ntfs_permission_lookup--;
#endif 

дают права на доступ к директории?


Название: Re: Почему не работает фильтр QDir (QT 4.6.2, Windows XP)
Отправлено: merke от Август 27, 2010, 18:55
Быстрее идет обработка


Название: Re: Почему не работает фильтр QDir (QT 4.6.2, Windows XP)
Отправлено: blood_shadow от Август 27, 2010, 19:00
Быстрее идет обработка
извиняюсь за назойливый вопрос(немного проблемы с инглишем), из-за чего проходит сборка это как-то связано с правами доступа к диску?


Название: Re: Почему не работает фильтр QDir (QT 4.6.2, Windows XP)
Отправлено: merke от Август 27, 2010, 19:03
вот тебе перевод:

Обратите внимание, что Qt по умолчанию не может проверить разрешений на NTFS файловыми системами, так как это может снизить производительность обработки файлов значительно. Можно заставить разрешение на проверку NTFS, включив следующий код в ваш источник:
Код:

 внешних Q_CORE_EXPORT qt_ntfs_permission_lookup Int


Разрешение проверки затем включать и выключать, увеличивая и уменьшение qt_ntfs_permission_lookup на 1.

Код:

qt_ntfs_permission_lookup + +; / / включить проверку
 qt_ntfs_permission_lookup - / / выключить ее снова


Разрешения типа ЬурейеЕ для QFlags <Permission>. Она хранит или сочетание Разрешение значений.


Название: Re: Почему не работает фильтр QDir (QT 4.6.2, Windows XP)
Отправлено: blood_shadow от Август 27, 2010, 19:17
вот тебе перевод:

Обратите внимание, что Qt по умолчанию не может проверить разрешений на NTFS файловыми системами, так как это может снизить производительность обработки файлов значительно. Можно заставить разрешение на проверку NTFS, включив следующий код в ваш источник:
Код:

 внешних Q_CORE_EXPORT qt_ntfs_permission_lookup Int


Разрешение проверки затем включать и выключать, увеличивая и уменьшение qt_ntfs_permission_lookup на 1.

Код:

qt_ntfs_permission_lookup + +; / / включить проверку
 qt_ntfs_permission_lookup - / / выключить ее снова


Разрешения типа ЬурейеЕ для QFlags <Permission>. Она хранит или сочетание Разрешение значений.

Хорошо каким образом влияют права на доступ к файлам и директориям на производительность обработки файлов? и почему тогда включив проверку прав, можно ускорить выполнение, или это означает что если директория не доступна для просмотра то она будет проигнорирована а в случае отсутствия проверки программа будет пытаться долгое время к ней достучатся?