QFile到QByteArray保存文件名

时间:2014-04-18 19:32:04

标签: c++ qt qtnetwork qfile qbytearray

我有QFile需要通过LAN网络发送。为此,我通过执行以下操作将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. ,系统会提示接收者
  4. 根据接收者的决定,Document1.docx保存在接收者的工作站中。
  5. 所以,我的问题是:当QFile转换为QByteArray然后再次(在另一台计算机中)转换为{{1}时,有没有办法知道QFile的名称和扩展名}}?

2 个答案:

答案 0 :(得分:0)

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

  问:有没有办法知道QFile的名称和扩展名   变成了QByteArray?

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

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

答案 1 :(得分:0)

你回答的具体问题是否定的。虽然特定文件在数据开头包含所谓的幻数(或签名),但此签名对于特定文件格式应该是唯一的。

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