2016-05-25 8 views
1

Я пытаюсь получить доступ к простому текстовому файлу из приложения Qt-widget с классом QFile для чтения записи. Чтение файла по строкам в виде строки отлично работает. Но открытие его, готового к написанию, терпит неудачу. Следующий код проверяет, существует ли файл и пытается установить соответствующие разрешения, но в конце файл не открывается. Вот неисправная часть кода:Qt: невозможно открыть файл для записи

#include "mainwindow.h" 
#include <QApplication> 
#include <QFile> 
#include <QDebug> 

int main(int argc, char *argv[]){ 
    QApplication app(argc, argv); 
    MainWindow w; 
    w.show(); 

    QFile file(":/test.dat"); 
    qDebug() << "exists?    " << file.exists(); 
    qDebug() << "writable?   " << file.isWritable(); 
    qDebug() << "permissions before? " << file.permissions(); 
    qDebug() << "permissions set?  " << file.setPermissions(QFileDevice::WriteOther | QFileDevice::ReadOther); 
    qDebug() << "permissions after? " << file.permissions(); 

    qDebug() << "opened?    " << file.open(QIODevice::Append); 
    qDebug() << "errors?    " << file.errorString(); 
    qDebug() << "errnum?    " << file.error(); 
    QTextStream out(&file); 
    out << "something to append"; 
    file.close(); 

    return app.exec(); 
} 

Qt возвращает это сообщение:

exists?    true 
writable?    false 
permissions before? QFlags(0x4|0x40|0x400|0x4000) 
permissions set?  false 
permissions after? QFlags(0x4|0x40|0x400|0x4000) 
opened?    false 
errors?    "Unknown error" 
errnum?    5 
QIODevice::write (QFile, ":/test.dat"): device not open 

Если изменить параметр в открытой функции QIODevice::ReadOnly файл может считываться без проблем, в противном случае с QIODevice::WriteOnly , Почему одно и тоже не работает для написания? Это разрешение? И почему не разрешаются изменения после того, как я позвонил setPermissions? Я запускаю Qt как root на Ubuntu 14.04. И test.dat имеет полные права -rwxrwxrwx, принадлежащие пользователю. Может кто-нибудь помочь? Спасибо!

ответ

2

У автора возникла проблема с Linux, связанная с записью в файл, созданный консольным процессом с повышенными привилегиями. Я полностью воспроизвел проблему, и когда попытался удалить файл с:

vi \home\myuser\Documents\f.txt // create file like that from console 
rm \home\myuser\Documents\f.txt // now try to remove it from console 

Я получил "rm: remove write-protected regular file "\home\myuser\Documents\f.txt" и ответил «да», а затем выше код показывает, после создания нового файла в контексте процесса программы:

opened?    true 
exists?    true 
writable?    true 
permissions before? QFlags(0x4|0x20|0x40|0x200|0x400|0x2000|0x4000) 
permissions set?  true 
permissions after? QFlags(0x4|0x20|0x40|0x200|0x400|0x2000|0x4000) 
errors?    "Unknown error" 
errnum?    0 

Я запускаю Qt Creator как root на Ubuntu 14.04.

Это не гарантирует привилегии программы, с которой вы работаете. UPDATE: убедитесь, что вы запускаете программу с соответствующими разрешениями, например. Корень в этом случае.

+0

Как я уже говорил, это не работает для меня. Я пробовал все OpenModeFlags, которые позволяли бы писать, но никто из них не работает. – zufall

+0

О, да, я пропустил. Попробуйте полностью освоить путь к ОС. Нет ~ и нет:/«Последнее может быть интерпретировано как внутренний ресурс Qt (просто догадка). Попробуйте поставить этот файл в другое место. – AlexanderVX

+0

Спасибо, за подсказку. Я использовал полный путь к ОС. измените права вручную, чтобы разрешения оставались таким образом в приложении Qt, но, к сожалению, файл все еще не может быть открыт для записи. – zufall

Смежные вопросы