QFile в QByteArray сохранить имя файла

У меня есть QFile, который нужно отправить через локальную сеть. Для этого я конвертирую QFile в QByteArray следующим образом:

//! [Inside a QTcpSocket class]

// Get the file name using a QFileDialog
QFile file(QFileDialog::getOpenFileName(NULL, tr("Upload a file")));

// If the selected file is valid, continue with the upload
if (!file.fileName().isEmpty) {
    // Read the file and transform the output to a QByteArray
    QByteArray ba = file.readAll();

    // Send the QByteArray
    write(ba);
}

Когда я получу его, я могу легко преобразовать его, используя:

void saveFile(QByteArray ba) {
    // Ask the user where he/she wants to save the file
    QFile file(QFileDialog::getSaveFileName(NULL, tr("Save file")));

    // Check that the path is valid
    if (!file.fileName().isEmpty()) {
       // Write contents of ba in file
       file.write(ba);
       // Close the file
       file.close();
    }
}

Однако я хотел бы знать имя файла (например, Document.docx) или, по крайней мере, знать его расширение, чтобы не заставлять пользователя точно знать, какой тип файла он получил.

В идеале, когда файл загружен, пользователю-получателю будет предложено сохранить файл. Например:

  1. Отправитель отправляет Document1.docx
  2. Получатель получает запрос, хочет ли он/она сохранить Document1.docx
  3. По решению получателя Document1.docx сохраняется на рабочей станции получателя.

Итак, мой вопрос: есть ли способ узнать имя и расширение QFile, когда оно преобразовано в QByteArray, а затем снова преобразовано (на другом компьютере) в QFile?


person Alex Spataru    schedule 18.04.2014    source источник


Ответы (2)


Вы просто читаете необработанные байты файла, используя QFile::readAll().

В: Есть ли способ узнать имя и расширение QFile при его преобразовании в QByteArray?

Нет. Имя и расширение файла не обязательно вставляются в байтах файла. Это зависит от формата файла. Например, вы можете создать свой собственный файл с определенным расширением и указать его имя и расширение в байтах.

Вы можете отправить имя и расширение файла вручную перед отправкой необработанных байтов файла. Перед этим вы можете отправить длину имени и расширения и количество байтов в файле. Таким образом, вы знаете, сколько байтов связано с именем, расширением и необработанными байтами.

person Nejat    schedule 18.04.2014
comment
Благодарю вас! Я решил проблему, создав два байтовых массива: один с содержимым, а другой с информацией о файле. Я изменил функцию saveFile, чтобы она принимала два массива QByteArray. - person Alex Spataru; 19.04.2014

Ответ на ваш конкретный вопрос - НЕТ. Хотя отдельные файлы содержат так называемые магические числа (или сигнатуры) в начале данных, эта сигнатура должна быть уникальной для конкретного формата файла.

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

person Alex    schedule 25.10.2016