lpt
2025-07-30 7c0f9b58ab5c7ae5f157c4d1a55e31c4d911c021
Server/¸¶ÁÖÌÎ/code/tianKai/addfile.cpp
@@ -4,7 +4,7 @@
#include <QDebug>
#include <QDateTime>
#include <QString>
#include <memory>
#define DEFAULT_PATH ("E:\soft")
#define DEFAULT_TYPE (tr("Pkg Files (*.zip *.tar.gz *.rar *.7z *.bz2)"))
#define UPLOAD 10
@@ -52,8 +52,92 @@
                        + createDate.toString() + "#"
                        + description;
    qDebug()<<versionMessage;
    emit addFileSignal(file, versionMessage);
    // èŽ·å–æ–‡ä»¶åŸºæœ¬ä¿¡æ¯
    QString fileName = fileInfo.fileName();
    qint64 size = fileInfo.size();
    //  è®¡ç®—头消息长度,并分配空间
    // å¤´æ¶ˆæ¯ï¼ˆç¤ºä¾‹ï¼‰
    int len = sizeof(UpLoadPkgHead) + fileName.size() + 1;
    std::shared_ptr<char> head(new char[len],[](char *p){delete[] p;});
    UpLoadPkgHead* pHead = reinterpret_cast<UpLoadPkgHead*>(head.get());
    // ç›´æŽ¥æ“ä½œæ™ºèƒ½æŒ‡é’ˆç®¡ç†çš„内存
    pHead->head.type = UPLOAD_REQ;
    pHead->head.len = len;
    memcpy(pHead->fileName, fileName.toUtf8().constData(), fileName.size());
    pHead->fileName[fileName.size()] = '\0';
    emit addFileSignal(head, len);  // ç›´æŽ¥ä¼ é€’智能指针
    QFile *pFile = new QFile(file);
    if(!pFile){
        return;
    }
    // è¯»æ–‡ä»¶å†…容
    if (!pFile->open(QIODevice::ReadOnly)) {
        qDebug() << "Failed to open file for reading:" << pFile->errorString();
        return;
    }
//    const int bufferSize = 4 * 1024;
    const int bufferSize = 8 * 1024;
    auto buffer = std::unique_ptr<char>(new char[bufferSize]);
    qint64 totalBytesRead = 0;
    int flag = 0;
    while (!pFile->atEnd()) {
        qint64 bytesRead = pFile->read(buffer.get(), bufferSize);
        if (bytesRead == -1) {
            qDebug() << "Error during read operation:" << pFile->errorString();
            break;
        }
        totalBytesRead += bytesRead;
        // æ•°æ®åŒ…构造(示例)
        int dtlen = sizeof(UpLoadPkgData) + fileName.size() + bytesRead + 2;
        std::shared_ptr<char> dataPkg(new char[dtlen],[](char *p){delete[] p;});
        UpLoadPkgData* pData = reinterpret_cast<UpLoadPkgData*>(dataPkg.get());
        // å¡«å……数据
        pData->head.len = len;
        pData->head.type = UPLOAD_REQ;
        pData->upLoadType = DATA_UPLOAD_REQ;
        pData->fileNameLen = fileName.size();
        pData->dataLen = bytesRead;
        pData->flag = ++flag;
        pData->dataLen = bytesRead;
        memcpy(pData->data, fileName.toUtf8().constData(), fileName.size());
        memcpy(pData->data + fileName.size() + 1, buffer.get(), bytesRead);
        emit addFileSignal(dataPkg, dtlen);
        // æ— éœ€æ‰‹åЍ free,shared_ptr è‡ªåŠ¨é‡Šæ”¾
    }
    if(totalBytesRead != size){
        qDebug()<<"数据发送不完整";
        return;
    }
    qDebug()<<"数据发送完成,发送数据库包";
    int finLen = sizeof(UpLoadPkgFin)+fileName.size()+versionMessage.size()+2;
    std::shared_ptr<char> finPkg(new char[finLen],[](char *p){delete[] p;});
    UpLoadPkgFin* pData = reinterpret_cast<UpLoadPkgFin*>(finPkg.get());
    // å¡«å……数据
    pData->head.len = finLen;
    pData->head.type = UPLOAD_REQ;
    pData->fileNameLen = fileName.size();
    pData->cnt = flag;
    memcpy(pData->fileName, fileName.toUtf8().constData(), fileName.size());
    memcpy(pData->fileName + fileName.size() + 1,versionMessage.data(),versionMessage.size());
    emit addFileSignal(finPkg ,finLen);
    emit addFileMsg(QString("上传成功!"));
    delete pFile;
}