qt 怎么实现用tcp 传输文件夹和里面的文件
时间: 2024-02-09 11:11:00 浏览: 135
在 Qt 中,你可以使用 QTcpSocket 类来实现基于 TCP 的文件传输。要传输文件夹和其中的文件,你需要使用递归函数遍历文件夹和子文件夹,并将它们发送到接收端。
以下是一个简单的代码示例,可以帮助你开始实现这个功能:
```cpp
// 客户端发送文件夹和文件
void sendFolder(QString folderPath, QTcpSocket *socket)
{
QFileInfo folderInfo(folderPath);
if (folderInfo.isFile()) {
// 发送文件
sendFile(folderPath, socket);
} else if (folderInfo.isDir()) {
// 发送文件夹
QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
out << QString("Folder") << folderInfo.fileName();
socket->write(byteArray);
// 遍历文件夹
QDir dir(folderPath);
QStringList files = dir.entryList(QStringList(), QDir::Files);
for (int i = 0; i < files.size(); ++i) {
QString filePath = folderPath + "/" + files.at(i);
sendFile(filePath, socket);
}
QStringList folders = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
for (int i = 0; i < folders.size(); ++i) {
QString folderPath = folderPath + "/" + folders.at(i);
sendFolder(folderPath, socket);
}
}
}
// 客户端发送文件
void sendFile(QString filePath, QTcpSocket *socket)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Failed to open file";
return;
}
QByteArray byteArray;
QDataStream out(&byteArray, QIODevice::WriteOnly);
out << QString("File") << QFileInfo(filePath).fileName() << file.readAll();
socket->write(byteArray);
file.close();
}
// 服务端接收文件夹和文件
void receiveFolder(QTcpSocket *socket)
{
QString folderName;
QByteArray byteArray = socket->readAll();
QDataStream in(&byteArray, QIODevice::ReadOnly);
in >> folderName;
QDir dir(folderName);
dir.mkpath(".");
while (socket->bytesAvailable() > 0) {
QByteArray byteArray = socket->readAll();
QDataStream in(&byteArray, QIODevice::ReadOnly);
QString type, fileName;
in >> type >> fileName;
if (type == "File") {
QFile file(folderName + "/" + fileName);
if (!file.open(QIODevice::WriteOnly)) {
qDebug() << "Failed to open file";
continue;
}
QByteArray data;
in >> data;
file.write(data);
file.close();
} else if (type == "Folder") {
receiveFolder(socket);
}
}
}
// 服务端开始监听
void startServer()
{
QTcpServer *server = new QTcpServer(this);
connect(server, &QTcpServer::newConnection, this, &MyClass::newConnection);
server->listen(QHostAddress::Any, 1234);
}
// 服务端新连接处理
void newConnection()
{
QTcpSocket *socket = server->nextPendingConnection();
receiveFolder(socket);
}
```
在这个例子中,客户端递归遍历文件夹并发送文件到服务端,服务端接收文件夹和文件。当接收到一个文件夹时,服务端会递归调用自己来接收文件夹中的内容。
阅读全文