linux下生成垃圾的工具 SnailRubbishFileFactory version0.003:)

通用工厂类Factory(C++实现) 灵光一闪:         抽象工厂模式经常被使用,那么同时也会多次写相同或类似的代码。能不能设计一个通用的工厂类,以避免重复设计工厂类呢? 阅读详情

#ifndef SNAILRUBBISHFILEFACTORY_H_
#define SNAILRUBBISHFILEFACTORY_H_

#include <qstring.h>
#include <qtimer.h>
#include <qfile.h>
#include <qdir.h>
#include <qimage.h>
#include <sys/select.h>
#include </usr/include/unistd.h> 

#include <fstream>
#include <iostream>

using std::ifstream;
using std::ofstream;
using std::fstream;
using std::ofstream;
using std::ios_base;
using std::cout;
using std::cin;
using std::endl;



#include <unistd.h>

void flushMemoryToDevice(){
    sync();
}

/*  date: 2007/01/10
 * version0.001 添加了生成垃圾文件的功能
 * version0.002 添加了指定图片文件复制生成垃圾的功能   -copyImage
 * version0.003 添加了sync功能,每生成一个垃圾调用一次sync    -sync
 */

void millisleep(int ms) {
    if (ms>0) {
        struct timeval tv;
        tv.tv_sec=0;
        tv.tv_usec=ms*1000;
        select(0, 0, 0, 0, &tv);
    }
}

class SnailRubbishFileFactory {
public:
    SnailRubbishFileFactory(QString rubbishDir) :
        rubbishSum_(0), processedArgc_(1), copyFromImage_(false),flushMemToDev(false) {
        rubbishDir_ = rubbishDir;
    }

    bool processArgv(int argc, char *argv[]) {
        bool exitProgream = true;
        bool goToMakeRubbish = false;

        bool processDone = true;
        while (processDone) {
            QString argvString;

            //            qWarning("processedArgc_-->%d",processedArgc_);
            //            qWarning("argc--->%d",argc);
            if (processedArgc_<argc) {
                //如果还有命令行参数未处理,则处理
                argvString = QString(argv[processedArgc_]);
                processedArgc_++;
            } else {
                return goToMakeRubbish;
            }

            if (argvString==QString("-changedir")) {
                if (argc>processedArgc_) {
                    QString dir = QString(argv[processedArgc_]);
                    QDir d(dir);
                    if (d.exists()) {
                        rubbishDir_ = dir;
                        qWarning("change dir-->%s", rubbishDir_.latin1());
                    } else {
                        qWarning("no this dir-->%s", dir.latin1());
                        qWarning("use default->%s", rubbishDir_.latin1());
                    }
                } else {
                    qWarning("no dir specify!");
                    qWarning("use default->%s", rubbishDir_.latin1());
                }
                qWarning("##################");
                qWarning("-changedir done");
                qWarning("##################/n");
                processedArgc_++;
                continue;
            }

            if (argvString==QString("-sync")) {
                flushMemToDev = true;
                qWarning("##################");
                qWarning("-sync done");
                qWarning("##################/n");
                continue;
            }
           
            if (argvString==QString("-copyImage")) {
                if (argc>processedArgc_) {
                    copyImageName = QString(argv[processedArgc_]);
                    if (!QFile::exists(copyImageName)) {
                        qWarning("no this file-->%s", copyImageName.latin1());
                        return goToMakeRubbish;
                    }
                    copyImage_ = QImage(copyImageName);
                    copyFromImage_ = true;
                } else {
                    qWarning("no file specify!");
                    return goToMakeRubbish;
                }
                qWarning("##################");
                qWarning("-copyImage done");
                qWarning("##################/n");
                processedArgc_++;
                continue;
            }

            if (argvString==QString("clean")) {
                qWarning("clean [%s] rubbish! ", rubbishDir_.latin1());
                QDir rubbishDir(rubbishDir_);
                int removeNum = 0;
                for (unsigned int i=0; i<rubbishDir.count(); i++) {
                    if (rubbishDir[i]!="."&&rubbishDir[i]!="..") {
                        rubbishDir.remove(rubbishDir[i]);
                        removeNum++;
                    }
                }
                qWarning("remove rubbish num->%d", removeNum);
                qWarning("##################");
                qWarning("clean done");
                qWarning("##################/n");
                return exitProgream;
            }

            if (argvString==QString("--version")) {
                qWarning("Snail RubbishMaker version 0.003!");
                qWarning("0.001 ---> make empty rubbish only!");
                qWarning("0.002 ---> make specify image rubbish!");
                qWarning("0.003 ---> add system call  sync()!");
                return exitProgream;
            }

            if (argvString==QString("--help")) {
                qWarning("rubbish [-sync]  [[-copyImage] imageAbsPath ]  [[-check] ??KB] [[-changedir] dirpath]  [clean]  [--help] [--version]-- make  rubish game!!");
                return exitProgream;
            }

            if (argvString==QString("-check")) {
                if (argc>processedArgc_) {
                    QString goodRubbishValue = QString(argv[processedArgc_]);
                    int goodRubbishVal = goodRubbishValue.toInt();
                    qWarning("good rubbish size?-->%s", goodRubbishValue.latin1());

                    QDir rubbishDir(rubbishDir_);
                    //            if(argc>2){
                    //                QString ruubishSizeString(argv[2]);
                    //                int ruubishSize = ruubishSizeString.toInt();
                    //                cout << "-------------------------------------------------" << endl;
                    //                qWarning("good rubbish is %d KB!!!",ruubishSize);
                    //                cout << "-------------------------------------------------" << endl;
                    //            }
                    bool hasAbad = false;
                    for (unsigned int i=0; i<rubbishDir.count(); i++) {
                        if (rubbishDir.count()<=2) {
                            qWarning("no rubbish!");
                            return exitProgream;
                        }
                        if (rubbishDir[i]!="."&&rubbishDir[i]!="..") {
                            QFile f(rubbishDir.filePath(rubbishDir[i]));
                            if ((float)f.size()/1024!=(float)goodRubbishVal) {
                                hasAbad = true;
                                qWarning("%s ->%fKB", rubbishDir[i].latin1(), (float)f.size()/1024);
                            }
                        }
                    }
                    if (!hasAbad) {
                        qWarning("all rubbish is good!!!!!!!!!!!");
                    }
                } else {
                    qWarning("no goodrubbish size exist!");
                }
                qWarning("##################");
                qWarning("-check done");
                qWarning("##################/n");
                return exitProgream;
            }
        }
        return goToMakeRubbish;
    }

    void collectRubbishInfo() {
        qWarning("/n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        qWarning("make rubbish --snail 2008/01/08");
        qWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /n/n/n/n");
        int rubbishNum;
        cout << "-------------------------------------------------" << endl;
        cout << "[input Rubbish num:] " << endl;;
        cin >> rubbishNum;
        if (rubbishNum<=0) {
            rubbishNum = 10;
        }

        setRubbishNum(rubbishNum);
        cout << "Rubbish Num:" << rubbishNum << endl;
        cout << "-------------------------------------------------" << endl;

        if (!copyFromImage_) {
            int rubbishSize;
            cout << "-------------------------------------------------" << endl;
            cout << "[input RubbishSize(KB):] ";
            cin >> rubbishSize;
            if (rubbishSize<=0) {
                rubbishSize = 10;
            }
            setRubbishSize(rubbishSize);
            cout << "Rubbish Size(KB):" << rubbishSize << endl;
            cout << "-------------------------------------------------" << endl;
        }

        int speed;
        cout << "-------------------------------------------------" << endl;
        cout << "[input createRubbishSpeed(ms):] ";
        cin >> speed;
        if (speed<=0) {
            speed = 1;
        }
        setRubbishCreateSpeed(speed);
        cout << "Rubbish Size(KB):" << speed << endl;
        cout << "-------------------------------------------------" << endl;

    }

    void startMakeRubbish() {
        QString rubbishName;
        while (++rubbishSum_<=rubbishNum_) {
            rubbishName = QString(rubbishDir_).append("/").append("rubbish").append(QString::number(rubbishSum_));
            if (copyFromImage_) {
                rubbishName.append(".jpg");
                makeRubbishFromImage(rubbishName);
            } else {
                makeDefaultRubbish(rubbishName);
                qWarning("make rubbish -->%s", rubbishName.latin1());
            }
            if(flushMemToDev){
                flushMemoryToDevice();
            }
            millisleep(makeRubbishSpeed_);
        }
        qWarning("------------------enjoy u rubbish!-------------------");
    }

private:
    int rubbishNum_;
    int rubbishKBSize_;
    int makeRubbishSpeed_;

    int rubbishSum_;
    QString rubbishDir_;
    int processedArgc_;

    QImage copyImage_;
    QString copyImageName;
    bool copyFromImage_;
   
    bool flushMemToDev;

    void setRubbishNum(int num) {
        rubbishNum_ = num;
    }

    void setRubbishSize(int numK) {
        rubbishKBSize_ = numK;
    }

    void setRubbishCreateSpeed(int sec) {
        makeRubbishSpeed_ = sec;
    }

    void makeDefaultRubbish(QString name) {
        ofstream to(name.latin1(), ios_base::binary);
        if (!to) {
            qWarning("cannot open the file:%s", name.latin1());
            return;
        }
        static char buf[1024];
        int sum = 0;
        do {
            to.write(buf, 1024);
            sum++;
        } while (sum < rubbishKBSize_);
        to.close();
    }

    void makeRubbishFromImage(QString name) {
        static const char* format = QImage::imageFormat(copyImageName);
        copyImage_.save(name, format);
        qWarning("make Image rubbish -->%s", name.latin1());
    }
};

int main(int argc, char *argv[]) {
#ifndef ARM_VERSION
    QString dir = "/home/snail/Desktop/rubbish";
#else
    QString dir = "/mmc/rubbish";
#endif //ARM_VERSION
    SnailRubbishFileFactory factory(dir);

    if (factory.processArgv(argc, argv)) {
        return 0;
    }

    factory.collectRubbishInfo();
    factory.startMakeRubbish();
}

#endif /*SNAILRUBBISHFILEFACTORY_H_*/
 

Linux下文件处理脚本——定期打包、压缩、循环覆盖 背景需求 应用程序产生的数据文件(*.csv格式)需要定期进行定期打包、压缩(*.tar.gz),压缩文件文件个数超过一定数量后循环覆盖。本文介绍一种Linux操作系统下脚本实现方式,当然也可以编写程序实现,个人认为,脚本语言实现显得更为简练。 流程图 脚本 #!/bin/sh #延时时间 looptime=3600 while : do #获取日期,使用awk获取外部变量 dateIndex=`date|awk '{print $3}'` yearIndex=`date|awk '{print $6}' 阅读详情

相关推荐

Mathtype公式排版避坑指南:固定行距20磅下如何完美显示上下标(实测有效)

本文针对学术论文在固定行距20磅要求下,Mathtype公式上下标显示不全或被裁剪的问题,提供了实测有效的解决方案。文章深入剖析了固定行距与公式排版的冲突原理,并详细指导用户通过调整Mathtype的“定义间距”参数(如下标深度、上标高度),以及利用“格式化公式”功能进行批量处理,确保公式在严格遵守期刊格式要求的同时清晰完整显示。

weixin_29228203的博客 1069

python简单学 抽象工厂模式【AbstractFactory Pattern】

本文介绍了抽象工厂模式的概念、工作原理、优点和缺点,以及适用情况。抽象工厂模式是一种创建型设计模式,用于创建一系列相关或依赖的对象家族,而不需要明确指定它们的具体类。文章通过一个跨平台 UI 库的示例,展示了如何使用抽象工厂模式来创建不同操作系统下的 UI 控件。抽象工厂模式能够封装变化、保持一致性,提高了代码的灵活性和可维护性。然而,也需要注意不要滥用,避免导致工厂类职责过重和不易扩展的问题。在需要创建一系列相关或依赖的对象家族,并且希望保持一致性的情况下,抽象工厂模式是一个不错的选择。

m0_38096164的博客 1073

Python_构建同花顺问财智能选股API服务

本文详细介绍了如何使用Python构建同花顺问财智能选股API服务,涵盖从环境准备、核心API开发到高级功能扩展的全过程。通过Flask框架和pywencai库,开发者可以快速搭建稳定可靠的选股接口,实现自动化股票筛选与交易系统集成,提升量化投资效率。

weixin_30596343的博客 329

linux factor 速度,Linux性能优化4

notesLinux中一切皆文件文件有两个数据结构,索引节点(index node)和目录项(directory entry),用来接入文件的元信息和目录结构。索引节点是每个文件的唯一标志,而目录项维护的正是文件系统的树状结构。目录项和索引节点的关系是多对一,一个文件可以有多个别名。VFS 内部又通过目录项、索引节点、逻辑块以及超级块等数据结构,来管理文件。目录项,记录了文件的名字,以及文件与其他...

weixin_33063489的博客 294

基于Python API的ECMWF大气数据批量下载与自动化处理实践

本文详细介绍了如何利用Python API实现ECMWF大气数据的自动化批量下载与处理。针对遥感分析中手动下载ERA5等数据的痛点,文章提供了从API密钥配置、核心脚本编写到元数据解析、任务队列调度及数据质量检查的全流程实践指南,旨在帮助科研与工程人员高效获取并处理大规模气象数据。

u8v9w0x1y的博客 479

深入解析TOM模块的PWM输出与ADC触发机制:从配置到DMA数据传输

本文深入解析了TOM模块在嵌入式系统中的核心应用,详细阐述了如何配置其PWM输出功能,并实现与ADC模块的硬件触发同步。重点介绍了通过DMA机制高效传输ADC采样数据的完整流程,涵盖时钟配置、工作模式选择、引脚映射及联调实战,为电机控制、数字电源等实时系统提供了一套硬件自动化的高效解决方案。

weixin_29227585的博客 367

Linux Factory 项目常见问题解决方案

Linux Factory 项目常见问题解决方案 项目基础介绍 Linux Factory 是一个开源项目,旨在为开发者提供一个简化 Linux 系统构建和定制的工具集。该项目的主要目标是帮助用户快速创建自定义的 Linux 发行版,适用于各种应用场景,如嵌入式系统、服务器和桌面环境。 该项目主要使用 Python 作为编程语言,结合了一些 Shell 脚本和 Makefile 来实现自动化构建和...

gitblog_00766的博客 381

AI实时盯盘与素材更新迭代功能开发——千川素材投流系统完全指南

《AI驱动的千川素材投流系统完全指南》摘要 本文针对抖音电商生态中巨量千川平台的素材投放挑战,提出了一套AI驱动的实时盯盘与素材更新迭代解决方案。系统通过分层架构设计,整合数据采集、实时监控、AI分析和自动化执行模块,实现分钟级数据追踪与智能决策。核心功能包括实时数据采集、异常检测、自动化投放调整和素材生命周期管理,有效解决人工盯盘效率低、素材生命周期短、决策响应慢等痛点。系统采用Python+FastAPI技术栈,结合机器学习和自动化工具,提供从数据采集到决策执行的全链路解决方案,帮助商家提升投放效率和R

huanghm88的专栏 231

开源项目推荐:linux-factory

开源项目推荐:linux-factory 1. 项目基础介绍及主要编程语言 linux-factory 是一个开源项目,旨在提供一个框架,用于创建定制的 Debian Linux 操作系统。该项目基于 Makefile 和一系列脚本,主要使用 Python 和 Shell 脚本语言进行开发。 2. 项目的核心功能 该项目的核心功能是允许用户通过配置文件和自定义的“覆盖层”(overlays),来定...

gitblog_00898的博客 351

华为OD机试真题 新系统 2026-08-16 Python&JS【智能家居模式调度优化】

智能家居系统中有多个自动化联动模式,每个模式 modes[i]=[start_time,end_time,power],表示它在左闭右开区间 [start_time,end_time) 内持续消耗固定功率 power。

MISAYAONE的博客 85

Triton server的部署、构建、backend插件机制代码梳理、模型加载、自定义C++backend流程

Triton inference server的部署、构建、backend机制代码详细梳理、模型加载过程、自定义C++backend流程.

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 473

工厂模式

一、简单工厂模式 1、介绍 简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式。它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。简单工厂模式的创建目标,而这些产品类都是来自同一个接口或者父类。工厂类是整个模式的关键所在,它包含必要的判断逻辑,同时也能根据外界给定的信息去决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。就像买电脑一...

weixin_47382783的博客 534

Python爬虫实战:利用Playwright与反反爬技术抓取Crunchbase企业数据

在当今数据驱动的商业环境中,获取准确的企业信息对于市场分析、竞争情报和投资决策至关重要。Crunchbase作为全球领先的企业信息平台,包含了数百万家公司、投资者和关键人员的详细数据。本文将深入探讨如何使用Python最新爬虫技术Playwright,结合多种反反爬策略,高效抓取Crunchbase企业数据。我们将从爬虫基础概念讲起,逐步深入到高级技巧,并提供完整的代码实现,帮助读者掌握现代网络数据采集的核心技术。网络爬虫技术自互联网诞生以来经历了显著演变。

2201_76125261的博客 1832

3.文件常见操作命令

本质: 硬链接:本质是同一个文件 软链接:本质不是同一个文件跨设备 硬链接:不支持 软链接:支持inode 硬链接:相同 软链接:不同链接数 硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少 软链接:创建或删除,链接数不会变化文件夹 硬链接:不支持 软链接:支持相对路径 硬链接:原始文件相对路径是相对于当前工作目录 软链接:原始文件的相对路径是相对于链接文件的相对路径删除源文件 硬链接:只是链接数减一,但链接文件的访问不受影响 软链接:链接文件将无法访问。

DaiGanLin的博客 893

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux车机工厂模式不见了,设计模式之工厂模式(Factory)

简单工厂:简单工厂其实不是一个设计模式,反而比较像是一种编程习惯。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂UML图简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品...

weixin_42498347的博客 1109

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

factory 命令参考

/* * factory - Realtek factory command * * Copyright (c) 2018 Realtek Semiconductor Corp. */ 1. Change u-boot environment: $ factory (load|set|save|list) [variable] [value] Set without valu...

viewsky11的专栏 1329

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

factory工厂的三种方式

简单工厂:简单的定义一个工厂接口然后实现一个工厂类,在调用的时候只能实现工厂中的这个方法 缺点是:当有逻辑变更时候,每次都要修改工厂中的这个方法,不共用 方法工厂:将工厂写到方法里,也就是说每个工厂做自己的逻辑,比如说有两个工厂都继承某个接口,接口中只能有一个工厂方法,然后不用的工厂类去实现这个方法,去执行自己的逻辑,在调用时通过不同的工厂类去调用不同的工厂方法。 缺点是:太单一,当处理复杂...

芒果哥的专栏 1095

How to clean your computer rubbish files and let your computer be faster

大家好,对于清理你电脑的垃圾文件我相信大家并不陌生吧,每个人都有自己总结的经验,我也一样,下面是鄙人总结的一些经验总结,如果有任何疑问,请mail给我 谢谢 第一种:磁盘清理 打开我的电脑 - 点击系统盘右键 - 选择属性然后就会弹出磁盘清理对话框,点击磁盘清理,然后等待扫描完毕后选择要清理的文件,点击确定就会自动清理垃圾了。(磁盘清理时最好少开一些应用程度这样可以清理的更干净)

xiabanghu的专栏 1185

Linux(centos)系统各个目录的作用详解

文件系统的类型  LINUX有四种基本文件系统类型:普通文件、目录文件、连接文件和特殊文件,可用file命令来识别。  普通文件:如文本文件、C语言元代码、SHELL脚本、二进制的可执行文件等,可用cat、less、more、vi、emacs来察看内容,用mv来改名。

YoungerChen的专栏 1264

Linux的文件和目录基本操作

简单的命令操作

weixin_55640305的博客 369

JS——Factory(工厂)模式

Factory模式时另一种创建型模式,涉及创建对象的概念。其分类不同于其他模式的地方在于它不显式地要求使用一个构造函数。而Factory可以提供一个通用的接口来创建对象,我们可以指定我们所希望创建的工厂对象的类型。 模式图: 如果对象创建过程相对比较复杂,这种方法特别有用,例如,如果它强烈依赖于动态因素或应用程序配置的话。 示例: Document //先定

spfLinux的博客 3077

liunx 制造大的垃圾文件,以方便测试可靠性测试

第一种:两个文件互相交叉for循环第二种:dd应用实例 dd if=/dev/zero of=/var/log/apigateway/console/run/catalina.out bs=202M count=1 &gt;/dev/null 2&gt;&amp;11.将本地的/dev/hdb整盘备份到/dev/hddheng@me: dd if=/dev/hdb of=/dev/hdd12.将/...

wzjudy的专栏 291

linux中循环创建文件,在Linux文件系统中创建一个循环

其他一些响应者已经回答了如何使用loopback设备设置挂载,但是您特别询问了绑定挂载,这有点不同.如果要使用绑定装载,只需在mount命令中指定–bind即可.例如:mount --bind /original/path /new/path这将使/ original / path中可访问的文件系统位置也可通过/ new / path访问.请注意,这不会跟随挂载点!例如,假设我有以下挂载点:/so...

weixin_36090220的博客 711

Linux kali

linux kali 学习记录1

Resets_的博客 470

清除Ubuntu中的多余配置文件(Clean the rubbish in the Ubuntu!)

转载至:http://hi.baidu.com/wwwwowo/blog/item/2828b2b736112ff630add104.html提示 1:清理残余的配置文件 localepurge 这个工具的具体用法 。 一般而言,当我们从 Ubuntu 系统中删除了一个软件之后,该软件的残余配置文件并没有被删除。如果你确信以后不再使用该软件,那么保留其配置文件实在没有必要,所以我们大可

Jeffery Lee的专栏 3384

python清除垃圾文件

写了个python 脚本用来清除某一目录下的临时文件、大小为0的文件以及空文件夹。 与大家分享下。 # -*- coding:utf-8 -*- import os; import re; work_dir = os.getcwd(); EXT = [".\.tmp",".\.TMP"]; file_num = 0; doc_num = 0; def clear_file(path):

代码面包 2484
上一篇: sync不错
下一篇: 没有main方法的Java程序
飞羽飞之猪
博客等级 码龄21年 127粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值