Russian Qt Forum
Апрель 26, 2024, 09:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFile и linux  (Прочитано 6479 раз)
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();
    }

Что еще можно попробовать сделать, чтобы этот файл все таки сохранился?
« Последнее редактирование: Сентябрь 15, 2016, 22:20 от onyborak » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Сентябрь 15, 2016, 23:52 »

http://linux.die.net/man/2/fsync ?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #2 : Сентябрь 16, 2016, 08:38 »

Вариант использовать системный вызов sync и безопасное извлечение не подходит.

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

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Сентябрь 16, 2016, 12:54 »

QSaveFile еще попробуй
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
onyborak
Гость
« Ответ #4 : Сентябрь 16, 2016, 20:44 »

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

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

По поводу fsync и QSaveFile попробую.
Записан
onyborak
Гость
« Ответ #5 : Сентябрь 16, 2016, 22:08 »

fsync не помог. Метод возвращает 0, но при этом все равно файла на носителе нет.
Записан
onyborak
Гость
« Ответ #6 : Сентябрь 16, 2016, 22:12 »

QSaveFile еще попробуй
с помощью QSaveFile::commit не работает. Метод всегда почему-то возвращает false.
Записан
onyborak
Гость
« Ответ #7 : Сентябрь 16, 2016, 22:13 »

Может быть есть еще какие идеи?
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #8 : Сентябрь 17, 2016, 11:04 »

Хотелось бы именно сделать запись конкретного файла и в конкретный момент времени.

как это понимать ? нужно записать файл например строго в 13:13 ?
Записан
onyborak
Гость
« Ответ #9 : Сентябрь 19, 2016, 19:08 »

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

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

Сообщений: 1175


Просмотр профиля
« Ответ #10 : Сентябрь 20, 2016, 09:07 »

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

гарантировать это может umount, вызванной этой функцией
почему нельзя вызвать umount ?
Записан
titan83
Гость
« Ответ #11 : Сентябрь 22, 2016, 13:23 »

Не вы первый, не вы последний.
Код:
system("sync");
поможет, точно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 22.