Russian Qt Forum

Qt => Вопросы новичков => Тема начата: onyborak от Сентябрь 15, 2016, 22:01



Название: QFile и linux
Отправлено: onyborak от Сентябрь 15, 2016, 22:01
Добрый вечер. Вопрос касаемо сохранения файла с помощью класса QFile на linux.

Собственно проблема:
Хочу сохранить файл на примонтированном usb носителе.
Открываю файл, сохраняю туда информацию, делаю QFile::flush() и закрываю его. Через команду ls вижу данный файл, затем просто выдергиваю флешку, затем опять ее вставляю. Через команду ls этого файла больше не вижу, его вообще нет на флешке. За редким исключением, он все таки иногда сохраняется и его видно после извлечения и вставки обратно. Вариант использовать системный вызов sync и безопасное извлечение не подходит. Необходимо чтобы это работало при экстренном извлечении носителя. Данный фрагмент кода отрабатывает полностью.
Собственно сам код:
Код:
    QFile TMPPlaylist(NameTMPPlayList);
    file.file_name = song.name;
    file.full_path = path;
    tmp_playlist.push_back(file);
    if (TMPPlaylist.open(QIODevice::Append | QIODevice::Text)) {
      qDebug() << "WRITE In= PlayList " << NameTMPPlayList << "song = " << path.toUtf8();
      QTextStream writeStream(&TMPPlaylist);
      writeStream << path << "\n";
      qDebug()<<"FLASH RETURN = " <<TMPPlaylist.flush();
      TMPPlaylist.close();
    }

Что еще можно попробовать сделать, чтобы этот файл все таки сохранился?


Название: Re: QFile и linux
Отправлено: Alex Custov от Сентябрь 15, 2016, 23:52
http://linux.die.net/man/2/fsync ?


Название: Re: QFile и linux
Отправлено: qate от Сентябрь 16, 2016, 08:38
Вариант использовать системный вызов sync и безопасное извлечение не подходит.

можно попробовать настроить опции монтирования для usb дисков (сам я не пробовал, но думаю такое возможно)



Название: Re: QFile и linux
Отправлено: kambala от Сентябрь 16, 2016, 12:54
QSaveFile еще попробуй


Название: Re: QFile и linux
Отправлено: onyborak от Сентябрь 16, 2016, 20:44
можно попробовать настроить опции монтирования для usb дисков (сам я не пробовал, но думаю такое возможно)

Да, есть. Но монтирование с опцией sync в моем случае это тоже плохо, т.к. все равно будут задержки в ПО тогда, когда это не нужно. Хотелось бы именно сделать запись конкретного файла и в конкретный момент времени.

По поводу fsync и QSaveFile попробую.


Название: Re: QFile и linux
Отправлено: onyborak от Сентябрь 16, 2016, 22:08
http://linux.die.net/man/2/fsync ?
fsync не помог. Метод возвращает 0, но при этом все равно файла на носителе нет.


Название: Re: QFile и linux
Отправлено: onyborak от Сентябрь 16, 2016, 22:12
QSaveFile еще попробуй
с помощью QSaveFile::commit не работает. Метод всегда почему-то возвращает false.


Название: Re: QFile и linux
Отправлено: onyborak от Сентябрь 16, 2016, 22:13
Может быть есть еще какие идеи?


Название: Re: QFile и linux
Отправлено: qate от Сентябрь 17, 2016, 11:04
Хотелось бы именно сделать запись конкретного файла и в конкретный момент времени.

как это понимать ? нужно записать файл например строго в 13:13 ?


Название: Re: QFile и linux
Отправлено: onyborak от Сентябрь 19, 2016, 19:08
как это понимать ? нужно записать файл например строго в 13:13 ?

Под определенным временем я тут подразумеваю: когда программа закончила выполнение этой функции, файл появился уже на носителе.


Название: Re: QFile и linux
Отправлено: qate от Сентябрь 20, 2016, 09:07
как это понимать ? нужно записать файл например строго в 13:13 ?
Под определенным временем я тут подразумеваю: когда программа закончила выполнение этой функции, файл появился уже на носителе.

гарантировать это может umount, вызванной этой функцией
почему нельзя вызвать umount ?


Название: Re: QFile и linux
Отправлено: titan83 от Сентябрь 22, 2016, 13:23
Не вы первый, не вы последний.
Код:
system("sync");
поможет, точно.