Не удается выполнить запись во временную папку в Windows 7 с помощью ofstream

#c #windows #qt

#c #Windows #qt

Вопрос:

Поскольку я использую Qt, я использую Qt-way для получения временной папки Windows. Это работает, но затем оказывается, что я не могу выполнить запись в эту папку.

Вот код :

    const QStringList defaultFolders = QStandardPaths::standardLocations(QStandardPaths::TempLocation);
   const QString tempFolder = defaultFolders.first();
   const QString fileName = tempFolder   "/testFile.txt";

   ofstream file(fileName.toLocal8Bit(), fstream::out);
   const bool ok = file.is_open();

   const QString msg = ok ? "Success" : "Failure";
   QMessageBox::warning(this, fileName, msg);
  

Что я пробовал до сих пор

  • Используя жестко заданный путь с «\» вместо «/»
  • Используя .toStdString().c_str() вместо «.toLocal8Bit()

Примечания

  • В пути есть подчеркнутый символ.
  • Пользователь Windows является администратором
  • Я могу вручную создавать / удалять файлы во временной папке, но скомпилированное приложение не может.
  • Я запускаю Windows 7 на виртуальной машине
  • Это работает нормально, если я использую старые функции C (fopen / fwrite / fclose)

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

Комментарии:

1. Возможно, использование toStdWString() вместо toLocal8Bit() будет работать лучше? std::filesystem::path filePath(fileName.toStdWString()); std::ofstream file(filePath); Хотя я сам этого не пробовал.

2. Временный путь на вашем компьютере может содержать неанглийские символы. toLocal8Bit() в этом случае может не сработать. Если вы не знакомы с кодировкой символов, просто используйте QFile и QTextStream вместо библиотеки std.

3. @CongMa Вы правы, в пути есть неанглийские символы. Я уже указал это в разделе примечаний моего вопроса. Использование QFile / QTextStream, вероятно, решило бы мою проблему, но это не было целью моего вопроса.

Ответ №1:

Возможно, использование toStdWString() вместо toLocal8Bit() будет работать лучше?

 std::filesystem::path filePath(fileName.toStdWString());
std::ofstream file(filePath);