Qt 之QDir文件目录拷贝、创建、删除 (***)

目录

QT之QDir文件目录拷贝、创建、删除 (*****)

Qt制作有进度条的拷贝文件夹和文件的小Demo ( 例 1 ) ( Qt拷贝文件、文件夹以及拷贝进度 )

QT 文件或目录拷贝,线程、进度条 ( 例 2 )

Qt5.9拷贝文件(复制文件)函数封装和总结(核心函数:QFile::copy())(**)

Qt4 简单读写文件及文件拷贝

Qt之文件夹下的所有文件拷贝,包括子目录

官方手册:copy(),QFile Class

-----------------------------------------------------

 

参考:

Qt:Qfile与QTextStream读写文本文件 + Qt QFile /readLine()(****)

Qt:Qfile与QTextStream读写文本文件 + Qt QFile /readLine()(****)_ken2232的博客-CSDN博客

C++操作文件行(读取,删除,修改指定行) (****)

C++操作文件行(读取,删除,修改指定行) (****)_ken2232的博客-CSDN博客

Qt 之QDir文件目录拷贝、创建、删除 (***)

Qt 之QDir文件目录拷贝、创建、删除 (***)_ken2232的博客-CSDN博客

Qt之Qfile读取文件操作:类介绍

Qt之Qfile读取文件操作:类介绍_qfile读取文件的任意位置_ken2232的博客-CSDN博客

C++ 读取文件最后一行产生的问题

C++ 读取文件最后一行产生的问题_ken2232的博客-CSDN博客

==================

官方手册:copy(),QFile Class

///## 注意:Qt 的 copy()函数,文件名之间的拷贝,不是文件夹

bool QFile::copy(const QString &newName)

Copies the file currently specified by fileName() to a file called newName. Returns true if successful; otherwise returns false.

Note that if a file with the name newName already exists, copy() returns false (i.e. QFile will not overwrite it).

The source file is closed before it is copied.

See also setFileName().

[static] bool QFile::copy(const QString &fileName, const QString &newName)

This is an overloaded function.

Copies the file fileName to newName. Returns true if successful; otherwise returns false.

If a file with the name newName already exists, copy() returns false (i.e., QFile will not overwrite it).

See also rename().

QFile Class

The QFile class provides an interface for reading from and writing to files. More...

Header:

#include <QFile>

qmake:

QT += core

Inherits:

QFileDevice

Inherited By:

QTemporaryFile

Note: All functions in this class are reentrant.

Public Types

typedef

DecoderFn

Public Functions

QFile(const QString &name, QObject *parent)

QFile(QObject *parent)

QFile(const QString &name)

QFile()

virtual

~QFile()

bool

copy(const QString &newName)

bool

exists() const

bool

link(const QString &linkName)

bool

open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)

bool

open(int fd, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)

bool

remove()

bool

rename(const QString &newName)

void

setFileName(const QString &name)

QString

symLinkTarget() const

==============================

 QT之QDir文件目录拷贝、创建、删除 (*****)

https://blog.csdn.net/PRML_MAN/article/details/115471236

在开发过程中,需要用到文件的一些处理,例如文件夹的拷贝,文件夹删除或创建,文件的拷贝、删除等操作。Qt已经包含了这些操作,作为一个跨平台的开发工具,这些功能绝对会帮助你在跨平台开发中很方便。

Qt中QDir类实现了对文件夹和路径的处理,QFile类实现了对文件的处理。

1 文件夹创建

使用Qt的QDir来实现文件夹的创建。

QDir path; // 创建一个QDir变量
if (!path.exists("c:/test")) {  // 使用QDir成员函数exists()来判断文件夹是否存在
    path.mkdir("c:/test");  // 使用mkdir来创建文件夹
}

2 文件夹删除

使用QDir类来实现文件的删除。

QDir path; // 创建一个QDir变量
if (path.exists("c:/test")) {  // 使用QDir成员函数exists()来判断文件夹是否存在
    path.remove("c:/test");  // 使用remove()来删除文件夹
}

  

3 文件的删除

使用QFile来实现文件的删除

QFile file("c:/test/1.txt"); // 创建一个QFile 变量
if (file.exists()) {  // 使用QFile 成员函数exists() 来判断文件夹是否存在
    file.remove();  // 使用remove()来删除文件夹
}

4 文件的拷贝

使用QFile来实现文件的拷贝

QString src = "c:/test/1.txt";
QString dst = "d:/test/2.txt";

QFile file(src); // 创建一个QFile 变量
file.copy(dst);  // 使用copy()完成文件的拷贝

5 文件夹的拷贝

使用QDir和QFile一起实现文件夹的递归拷贝

///## 注意:Qt 的 copy()函数,是文件名之间的拷贝,不是文件夹

QString src = "c:/test";
QString dst = "d:/receive";

void CopyDir(QString src, QString dst)
{
    QDir srcDir(src);
    QDir dstDir(dst);
    
    if (!dstDir.exists()) {
        dstDir.mkdir();
    }

    QFileInfoList list = srcDir.entryInfoList();

    foreach (QFileInfo info, list) {
        if (info.fileName() == "." || info.fileName == "..") {
            continue;
        }
        if (info.isDir()) {
            // 创建文件夹,递归调用该函数
            CopyDir(info.filePath(), dst + "/" + info.fileName());
            continue;
        }
        // 文件拷贝
        QFile file(info.filePath());
        file.copy(dst + "/" + info.fileName());
    }
}

————————————————
版权声明:本文为CSDN博主「PRML_MAN」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/PRML_MAN/article/details/115471236

Qt之文件夹下的所有文件拷贝,包括子目录

  https://blog.csdn.net/weixin_41734758/article/details/108501230

Qt4 简单读写文件及文件拷贝

我的环境是Visual Studio 2005 + Qt4。

以下代码实现对文件的简单读写,并实现文件的拷贝。

#include <QCoreApplication>
#include<QtCore>
#include<iostream>
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QFile file("data.file");
   
    
    /*向文件中写入数据*/
    file.open(QIODevice::WriteOnly| QIODevice::Truncate);   //打开文件,Truncate能覆盖原有内容
    QDataStream qout(&file); //文件流
    qout << QString("Zhang");
    
    //写数据
    qout << QDate::fromString("2009/10/29", "yyyy/MM/dd");
    qout << (qint32)21;
    file.close();
    
    //文件打开错误
    if(!file.open(QIODevice::ReadOnly)){
        cout << "Open Error!!";
        return 1;
    }
    
    
    
    QFile copy("copy.file"); //拷贝文件名
    QDataStream out(&copy);
    
    copy.open(QIODevice::WriteOnly);
    
    copy.write(file.readAll());//拷贝
    
    file.close();
    copy.close();
    
    /*读取拷贝文件*/
    QString name;
    QDate birthday;
    qint32 age;
    
    if(!copy.open(QIODevice::ReadOnly)){
        cerr << "Error!!";
        return 1;
    }
    
    
    
    QDataStream in(&copy);
    in >> name >> birthday >> age;//读数据
    
    //输出到控制台
    cout << qPrintable(name) << endl;
    cout << qPrintable(birthday.toString("yyyy MMMM dd dddd")) << endl;
    cout << age << endl;
    
    copy.close();
    
    return a.exec();
}

拷贝方法还可以使用QFile的一个方法:

bool QFile::copy(const QString & newName)

或者静态方法:

bool QFIle::copy(const QString & fileName, const QString & newName) [static]

————————————————
版权声明:本文为CSDN博主「tzcherish」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tzcherish/article/details/4957515

Qt拷贝文件、文件夹以及拷贝进度

Qt制作有进度条的拷贝文件夹和文件的小Demo

https://blog.csdn.net/u014597198/article/details/78752321

头文件:

#ifndef SFILECOPY_H
#define SFILECOPY_H
 
#include <QObject>
#include <QDir>
 
class SFileCopy : public QObject
{
    Q_OBJECT
public:
    explicit SFileCopy(QObject *parent = 0);
    ~SFileCopy();
 

     ///## 注意1:Qt 的 copy()函数,是文件名之间的拷贝,不是文件夹

     ///## 注意2:这个函数中的参数,应该是 sourceFile ? 不是 sourceDir ?
    //拷贝文件:
    bool copyFileToPath(QString sourceDir ,QString toDir, bool coverFileIfExist);

//========================================

    
    //拷贝文件夹:
    bool copyDirectoryFiles(const QString &fromDir, const QString &toDir, bool coverFileIfExist);
signals:
    void sigCopyDirStation(float num);
    void sigCopyDirOver();
private:
    QDir * m_createfile = Q_NULLPTR;
    float m_total = 0;
    float m_value = 0;
    bool m_firstRead = true;
};
 
#endif // SFILECOPY_H

源文件:

#include "sfilecopy.h"
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QDebug>
 
SFileCopy::SFileCopy(QObject *parent) : QObject(parent)
{
    m_createfile = new QDir();
}
 
SFileCopy::~SFileCopy()
{
    if(m_createfile) {
        m_createfile = Q_NULLPTR;
        delete m_createfile;
    }
}
 
bool SFileCopy::copyFileToPath(QString sourceDir, QString toDir, bool coverFileIfExist)
{
    toDir.replace("\\","/");
    if (sourceDir == toDir){
        return true;
    }
    if (!QFile::exists(sourceDir)){
        return false;
    }
    bool exist = m_createfile->exists(toDir);
    if (exist){
        if(coverFileIfExist){
            m_createfile->remove(toDir);
        }
    }//end if
 
    if(!QFile::copy(sourceDir, toDir)) {
        return false;
    }
    return true;
}
 
bool SFileCopy::copyDirectoryFiles(const QString &fromDir, const QString &toDir, bool coverFileIfExist)
{
    QDir sourceDir(fromDir);
    QDir targetDir(toDir);
    qDebug() << "copyDirectoryFiles:" << fromDir << toDir;
    if(!targetDir.exists()){    /**< 如果目标目录不存在,则进行创建 */
        if(!targetDir.mkdir(targetDir.absolutePath())) {
            return false;
        }
    }
    QFileInfoList fileInfoList = sourceDir.entryInfoList();
 
    if(m_firstRead) {
        int isfileTMP = 0;
        qDebug() << "a copyDirectoryFiles:" << fileInfoList.count();
        foreach(QFileInfo fileInfo, fileInfoList){
            if(fileInfo.isFile()) {
                isfileTMP++;
            }
        }
        m_total = fileInfoList.count() - 2 - isfileTMP; // 2为.和..
        m_value = 0;
        m_firstRead = false;
        qDebug() << "a copyDirectoryFiles:" << fileInfoList.count() <<m_total << isfileTMP;
        emit sigCopyDirStation(m_value/m_total);
        if(m_value == m_total) {
            m_firstRead = true;
            emit sigCopyDirStation(1);
            emit sigCopyDirOver();
        }
    } else {
        m_value++;
        if(m_value == m_total) {
            m_firstRead = true;
            emit sigCopyDirOver();
        }
        qDebug() << "a copyDirectoryFiles:" << m_value <<m_total;
        emit sigCopyDirStation(m_value/m_total);
    }
    foreach(QFileInfo fileInfo, fileInfoList){
        if(fileInfo.fileName() == "." || fileInfo.fileName() == "..") {
            continue;
        }
        if(fileInfo.isDir()){    /**< 当为目录时,递归的进行copy */
            if(!copyDirectoryFiles(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()), coverFileIfExist)) {
                return false;
            }
        } else{            /**< 当允许覆盖操作时,将旧文件进行删除操作 */
            if(coverFileIfExist && targetDir.exists(fileInfo.fileName())){
                targetDir.remove(fileInfo.fileName());
            }
            /// 进行文件copy
            if(!QFile::copy(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()))){
                return false;
            }
        }
    }
    return true;
}


 

调用:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QDateTime>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_file = new SFileCopy(this);
    connect(m_file, &SFileCopy::sigCopyDirStation,[=](float num){
        ui->progressBar->setValue(100*num);
    });
    connect(m_file, &SFileCopy::sigCopyDirOver,[=](){
        ui->label->setText("Over");
    });
    m_fileDialog = new QFileDialog(this);
    m_fileDialog->setWindowTitle(tr("Open"));
    m_fileDialog->setDirectory(".");
    m_fileDialog->setFileMode(QFileDialog::DirectoryOnly);
    m_fileDialog->hide();
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
    ui->label->setText("");
    m_fileDialog->show();
    QStringList files;
    if(m_fileDialog->exec() == QDialog::Accepted) {
        files = m_fileDialog->selectedFiles();
    }
    QString fTMP = files.first();
    QString newTMP = fTMP + QDateTime::currentDateTime().toString("yyyy-MM-dd");
    m_file->copyDirectoryFiles(fTMP, newTMP , true);
}

QT 文件或目录拷贝,线程、进度条 ( 例 2 )

  https://blog.csdn.net/m0_37987268/article/details/110653570

文件/或目录拷贝,在子线程中实现,可实时通知拷贝进度

#ifndef SYSTEMFILECOPY_H
#define SYSTEMFILECOPY_H

#include <QObject>

class QThread;
class SystemFileCopy : public QObject
{
    Q_OBJECT
public:
    SystemFileCopy(const QString& SourcePath, const QString& TargetPath);

    void SetInterrupt(bool interrupt) {m_bInterrupt = interrupt;}
    void startThread();

protected slots:
    void startCopy();

signals:
    void sig_copyProgress(qint64 bytesCopyed, qint64 total); //拷贝进度
    void sig_startCopy(const QString& fileName);    //单个文件开始拷贝
    void sig_finshedCopy(const QString& targetPath, bool result); //单个文件拷贝结束信号
    void sig_errorInfo(const QString& errorString); //错误信息
    void sig_finished(bool bSuccess); //拷贝结束信号

private:
    bool detailFileInfo(const QString& from, const QString& target, QStringList& fromFileList, QStringList& toFileList);
private:
    QString m_sSourcePath; //源目录/文件
    QString m_sTargetPath;  //目标目录
    QThread *m_pThread;
    bool m_bInterrupt;      //是否中断取消
};

#endif // SYSTEMFILECOPY_H

#include "systemfilecopy.h"
#include <QFileInfo>
#include <QDir>
#include <QFile>
#include <qthread.h>

#define COPY_SIZE 1024*1024*4
SystemFileCopy::SystemFileCopy(const QString& SourcePath, const QString& TargetPath)
    :m_sSourcePath(SourcePath),
      m_sTargetPath(TargetPath),
      m_pThread(new QThread),
      m_bInterrupt(false)
{
    moveToThread(m_pThread);
    connect(m_pThread, &QThread::started, this, &SystemFileCopy::startCopy);
    connect(this, &SystemFileCopy::sig_finished, m_pThread, &QThread::quit);
    connect(m_pThread, &QThread::finished, m_pThread, &QThread::deleteLater);
}

void SystemFileCopy::startCopy()
{
    QStringList fromList, targetList;
    if(!detailFileInfo(m_sSourcePath, m_sTargetPath, fromList, targetList))
    {
        emit sig_finished(false);
        return;
    }
    int nSize = fromList.size();
    if(nSize != targetList.size() || nSize == 0)
    {
        emit sig_finished(false);
        return;
    }

    qint64 totalSize = 0, writeTotal = 0;
    foreach (const QString& var, fromList) {
        totalSize+=QFileInfo(var).size();
    }

    for(int i = 0; i < nSize; ++i)
    {
        const QString& targetPath = targetList.at(i);
        QDir tmpDir(QFileInfo(targetPath).absoluteDir());
        if(!tmpDir.exists())
        {
            tmpDir.mkpath(tmpDir.path());
        }

        QFile sourceFile(fromList.at(i));
        if(!sourceFile.open(QIODevice::ReadOnly))
        {
            emit sig_errorInfo(sourceFile.errorString());
            sourceFile.close();
            continue;
        }

        QFile targetFile(targetPath);
        if(QFile::exists(targetPath))
            QFile::remove(targetPath);
        if(!targetFile.open(QIODevice::WriteOnly))
        {
            emit sig_errorInfo(targetFile.errorString());
            targetFile.close();
            continue;
        }

        emit sig_startCopy(sourceFile.fileName());
        qint64 sourceSize = sourceFile.size();
        while(sourceSize)
        {
            if(m_bInterrupt)
            {
                emit sig_finished(true);
                return;
            }

            QByteArray byteArry =  sourceFile.read(COPY_SIZE);
            qint64 writeSize = targetFile.write(byteArry);
            if(byteArry.size() == writeSize)
            {
                writeTotal += writeSize;
                sourceSize -= writeSize;
                emit sig_copyProgress(writeTotal, totalSize);
            }
        }
        sourceFile.close();
        targetFile.close();
        emit sig_finshedCopy(targetPath, true);
    }

    emit sig_finished(true);
}


void SystemFileCopy::startThread()
{
    m_pThread->start();
}

bool SystemFileCopy::detailFileInfo(const QString& from, const QString& target, QStringList& fromFileList, QStringList& toFileList)
{
    /*if(!QFileInfo(target).isDir())
        return  false;*/

    QFileInfo SourceInfo(from);
    if(!SourceInfo.exists())
        return  false;

    if(SourceInfo.isDir())
    {
        QString tmpPath = target +"/" + SourceInfo.fileName();
        QFileInfoList fileInfoList(QDir(from).entryInfoList());
        foreach (const QFileInfo& var, fileInfoList) {
            if(!var.fileName().compare(".") ||!var.fileName().compare(".."))
                continue;
            if(var.isDir())
            {
                if(!detailFileInfo(var.filePath(), tmpPath, fromFileList, toFileList))
                    return false;
            }
            else
            {
                fromFileList << SourceInfo.filePath();
                toFileList << target+"/"+SourceInfo.fileName()
            }
        }
    }
    else
    {
        fromFileList << SourceInfo.filePath();
        toFileList << target+"/"+SourceInfo.fileName();
    }
    return  true;
}

``使用方式:

```cpp
SystemFileCopy* pCopy = new SystemFileCopy("D:/abc", "D:/ded");
pCopy->startThread();

类中有信号,可根据需要自行连接

=======================

Qt5.9拷贝文件(复制文件)函数封装和总结(核心函数:QFile::copy())

本文主要总结用Qt5.9封装一个函数,该函数的功能是拷贝源目录下的文件到指定目录下,具体的定义如下所示:

void copyFiltTo(QString sourcePath,QString destPath, QStringList fileType);

其中,sourcePath表示源目录地址;destPath表示目的目录地址;fileType表示要复制的文件类型,比如*.png。

下是主要代码:

    void Widget::copyFiltTo(QString sourcePath, QString destPath, QStringList fileType)
    {
        qDebug()<<tr("移动文件");
        /*逻辑处理*/
        QString pathsDir = sourcePath;
        QStringList strList = getDirFilesName(pathsDir,fileType);
        QString sourceDir=sourcePath;
        QString destDir=destPath;
     
        for(int i=0;i<strList.count();i++)
        {
            if(QFile::copy(sourceDir+strList.at(i),destDir+strList.at(i)))
            {
                qDebug()<<tr("拷贝文件%1成功!").arg(strList.at(i));
            }
     
            else
            {
                qDebug()<<tr("拷贝文件失败!").arg(strList.at(i));
            }
        }
    }

    QStringList Widget::getDirFilesName(QString pathsDir,QStringList filters)
    {
        /*获取文件夹下的文件名称*/
        QDir dir(pathsDir);
        if (!dir.exists())
        {
            return QStringList("");
        }
        dir.setFilter(QDir::Files | QDir::NoSymLinks);
        dir.setNameFilters(filters);
        QStringList allImageNameList = dir.entryList();
        if (allImageNameList.count() <= 0)
        {
            return QStringList("");
        }
        return allImageNameList;
    }

下面将展示一个调用该函数的实例。

1.1新建一个widget工程,不要勾选ui界面。然后分别在widget.h,widget.cpp,main.cpp分别添加如下代码。

widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
     
    #include <QWidget>
    #include <QVBoxLayout>
     
    class Widget : public QWidget
    {
        Q_OBJECT
     
    public:
        Widget(QWidget *parent = 0);
        ~Widget();
        void createView();
        QStringList getDirFilesName(QString pathsDir, QStringList filters);
        void copyFiltTo(QString sourcePath,QString destPath, QStringList fileType);
     
    private slots:
        void moveFilesDirBtnSlot();
     
    private:
        QVBoxLayout *mainLayout;
    };
     
    #endif // WIDGET_H

widget.cpp

    #include "widget.h"
    #include <QPushButton>
    #include <QDebug>
    #include <QFile>
    #include <QDir>
     
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        createView();
    }
     
    Widget::~Widget()
    {
     
    }
     
    void Widget::createView()
    {
        /*UI界面*/
        mainLayout = new QVBoxLayout(this);
        QPushButton *moveFilesDirBtn = new QPushButton("移动文件");
        mainLayout->addWidget(moveFilesDirBtn);
        mainLayout->addStretch();
        connect(moveFilesDirBtn,SIGNAL(clicked(bool)),this,SLOT(moveFilesDirBtnSlot()));
    }
     
    QStringList Widget::getDirFilesName(QString pathsDir,QStringList filters)
    {
        /*获取文件夹下的文件名称*/
        QDir dir(pathsDir);
        if (!dir.exists())
        {
            return QStringList("");
        }
        dir.setFilter(QDir::Files | QDir::NoSymLinks);
        dir.setNameFilters(filters);
        QStringList allImageNameList = dir.entryList();
        if (allImageNameList.count() <= 0)
        {
            return QStringList("");
        }
        return allImageNameList;
    }
     
    void Widget::copyFiltTo(QString sourcePath, QString destPath, QStringList fileType)
    {
        qDebug()<<tr("移动文件");
        /*逻辑处理*/
        QString pathsDir = sourcePath;
        QStringList strList = getDirFilesName(pathsDir,fileType);
        QString sourceDir=sourcePath;
        QString destDir=destPath;
     
        for(int i=0;i<strList.count();i++)
        {
            if(QFile::copy(sourceDir+strList.at(i),destDir+strList.at(i)))
            {
                qDebug()<<tr("拷贝文件%1成功!").arg(strList.at(i));
            }
     
            else
            {
                qDebug()<<tr("拷贝文件失败!").arg(strList.at(i));
            }
        }
    }
     
    void Widget::moveFilesDirBtnSlot()
    {
        qDebug()<<tr("移动文件");
        /*逻辑处理*/
        QString sourceDir="D:/userdataImage/RecoveredData/.4/";
        QString destDir="D:/userdataImage/RecoveredData/pic/";
        QStringList filters;
        filters<<"*.jpg";
        copyFiltTo(sourceDir,destDir,filters);
    }

main.cpp

    #include "widget.h"
    #include <QApplication>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Widget w;
        w.resize(960,640);
        w.show();
     
        return a.exec();
    }

1.2程序构建和运行后,结果如下所示:

参考内容:

https://blog.csdn.net/naibozhuan3744/article/details/81071057(获取目录下所有文件名称)

https://blog.csdn.net/ymc0329/article/details/7975654/(拷贝文件)

https://blog.csdn.net/mao19931004/article/details/51501200(Qt常用文件操作类介绍)
————————————————
版权声明:本文为CSDN博主「三公子Tjq」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/naibozhuan3744/article/details/81319012

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值