QFile转换为QByteArray保存文件名

4

我有一个需要通过局域网发送的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时知道其名称和扩展名?
2个回答

1

您刚使用QFile::readAll()读取了文件的原始字节。

问:在将QFile转换为QByteArray时,是否有办法知道其名称和扩展名?

没有。文件名和扩展名不一定插入在文件的字节中。这取决于文件格式。例如,您可以使用特定的扩展名创建自定义文件,并将其名称和扩展名放在字节的开头。

您可以在发送文件的原始字节之前手动发送文件的名称和扩展名。在此之前,您可以发送名称和扩展名的长度以及文件中的字节数。这样,您就知道了与名称、扩展名和原始字节相关联的字节数。


谢谢!我通过创建两个字节数组解决了这个问题:一个包含内容,另一个包含文件信息。我将saveFile函数更改为接受两个QByteArrays。 - Alex Spataru

0

针对您的问题,答案是否定的。虽然特定文件在数据开头包含所谓的魔数(或签名),但是这个签名应该是特定文件格式唯一的。

但是您描述的问题似乎并不严重,因为您可以简单地将文件名字符串和扩展名字符串与文件内容分开发送。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接