Qt C++,QByteArray读取一个超过2GB的文件,写一类封装一下
时间: 2024-10-08 08:25:19 浏览: 66
Qt C++ 提供了一套强大的库用于处理文件操作,包括大数据量文件的读写。如果你需要处理超过2GB的大文件,并希望将其封装成一个易于使用的类,可以这样做:
```cpp
#include <QObject>
#include <QFile>
#include <QByteArray>
class LargeFileHandler : public QObject
{
public:
explicit LargeFileHandler(const QString& filePath) : file(filePath) {}
private slots:
void readAllData();
void writeData(QByteArray data);
signals:
void dataReadFinished(QByteArray data);
void writingProgress(int progress); // 可选信号,用于反馈写入进度
private:
QFile file;
QByteArray buffer;
qint64 fileSize() const { return file.size(); }
// 分块读取大文件,避免一次性加载到内存
void readDataChunk(qint64 start, qint64 end) {
qint64 remaining = end - start + 1;
if (remaining <= buffer.size()) {
file.seek(start);
file.read(buffer.data(), remaining);
emit dataReadFinished(buffer);
} else {
qint64 toRead = buffer.size();
file.seek(start);
file.read(buffer.data(), toRead);
emit dataReadFinished(buffer);
// 递归读取剩余部分
readDataChunk(start + toRead, end);
}
}
// 封装写数据的部分,这里仅作示例,通常会添加错误处理和进度更新机制
void writeDataImpl(QByteArray data) {
if (file.isOpen()) {
int written = file.write(data);
emit writingProgress(written);
}
}
};
// 使用方法示例
void LargeFileHandler::readAllData() {
if (!file.open(QIODevice::ReadOnly)) {
qWarning("Failed to open file");
return;
}
qint64 totalSize = fileSize();
qint64 chunkSize = std::min(totalSize, qint64(1024 * 1024 * 1024)); // 1GB大小的块
qint64 start = 0;
while (start < totalSize) {
readDataChunk(start, std::min(start + chunkSize, totalSize));
start += chunkSize;
}
}
// 示例写入数据
void writeLargeFile(LargeFileHandler* handler, QByteArray data) {
if (!handler->file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
qCritical("Failed to open file for writing");
return;
}
handler->writeDataImpl(data);
handler->file.close();
}
```
这个`LargeFileHandler`类封装了大文件的读写操作,通过分块处理避免一次性加载整个文件到内存。在实际应用中,你可以创建并管理这样的对象,通过`readAllData()`读取文件内容,`writeData(QByteArray data)`方法用于写入数据。
阅读全文