Qt не может создавать/записывать в C:\

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

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

QПриложение 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");

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

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

Джек


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

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


person jecjackal    schedule 09.01.2011    source источник
comment
Однако QFile не дает мне никакого кода ошибки: вы должны проверить возвращаемое значение debugFile.open().   -  person Frank Osterfeld    schedule 09.01.2011


Ответы (3)


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

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

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

person Mihai Limbășan    schedule 09.01.2011
comment
Вы были абсолютно правы. Мои файлы хранились в виртуальном хранилище (во всяком случае, большинство из них. У меня была подпапка, которая по какой-то причине не сохранялась виртуально). Я добавил манифест, поэтому моя программа теперь работает виртуально. Спасибо. - person jecjackal; 10.01.2011

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

person rubenvb    schedule 09.01.2011
comment
Насколько я знаю, вы не можете запрашивать права администратора для уже запущенного процесса, но вам нужно запустить другой процесс для выполнения операций, требующих этих разрешений. - person Frank Osterfeld; 09.01.2011

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

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

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

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

person rohanpm    schedule 09.01.2011
comment
Вау, ты был прав. Я проверял код ошибки перед открытием файла. Что ж, вот что происходит, когда я допоздна пишу код :). Спасибо. - person jecjackal; 10.01.2011