Qt не может создать / записать в C: \ - PullRequest
5 голосов
/ 09 января 2011

Я пишу программу Qt (изначально 4.7 для Windows 7), которая требует записи в установленный каталог (C: \ Program Files ...).Файлы не создаются при попытке записи в место, которое будет «защищено» (программные файлы, C: \ etc).Однако QFile не дает мне никакого кода ошибки (error () возвращает 0, что означает, что он работал нормально).

Вот фрагмент кода, который я использую, который не работает.Я закрываю файл чуть позже в программе.

QApplication a (argc, argv);

// Setting plugin paths.
QStringList paths = QCoreApplication::libraryPaths();
paths.append(QCoreApplication::applicationDirPath());
QCoreApplication::setLibraryPaths(paths);



// Debug file.
QString path = QCoreApplication::applicationDirPath() + "/debug.dat";
//QFile debugFile(QCoreApplication::applicationDirPath() + "/debug.dat");
QFile debugFile("C:/debug.txt");
qDebug() << debugFile.error();
debugFile.setPermissions(QFile::WriteUser | QFile::WriteGroup | QFile::WriteOwner | QFile::WriteOther);
debugFile.open(QFile::WriteOnly);
QTextStream debugStream(&debugFile);

// Processing the arguments.
debugStream << QString("Processing Arguments\n");

У кого-нибудь есть какие-либо советы по решению этой проблемы?

Спасибо за помощь,

Jec


Добавление файла манифеста - это маршрут, который я выбрал для решения этой проблемы.

Спасибо за всепомощь.

Ответы [ 3 ]

7 голосов
/ 09 января 2011

Вы проверили, не создан ли файл в VirtualStore для этого пользователя? Проверьте средство просмотра событий в разделе Журналы приложений и служб -> Microsoft -> Windows -> UacFileVirtualization -> Операционная. Если вы видите записи с идентификатором события 5000, произошло событие FileCreateVirtualExclude.

Проверьте, не был ли файл создан под %USERPROFILE%\AppData\Local\VirtualStore. Если это так, вам может понадобиться встроить манифест, запрашивающий требуемые привилегии (то есть отключение виртуализации).

Подробнее см. Новые технологии UAC для Windows Vista (прокрутите вниз и найдите виртуализацию.)

2 голосов
/ 10 января 2011

QFile может выдавать вам код ошибки, но вы не смогли его проверить.

Вы должны сделать что-то вроде:

if (!debugFile.open(QFile::WriteOnly)) {
    qWarning() << "Failed to open" << debugFile.fileName() << "for write:" << debugFile.errorString();
}

Вы проверили возвращаемое значение QFile::error, но только до вызова open - вам нужно проверить после попытки открытия.

2 голосов
/ 09 января 2011

Вам необходимо приобрести достаточные права доступа пользователя (например, «Запуск от имени администратора») для записи в такие папки в Windows Vista +. Либо запустите приложение от имени администратора, либо запросите права администратора с помощью вызова WinAPI.

...