Windows下使用C++获取目录及子目录下所有文件

C++知识点——DIR遍历文件(第一级) C++知识点——遍历文件(第一级) 阅读详情

转载自:

http://read.pudn.com/downloads192/sourcecode/math/903237/贝叶斯邮件过滤源程序(VC%2B%2B实现的源程序)/ReadDir/BrowseDir.h__.htm

http://blog.youkuaiyun.com/abcjennifer/article/details/18147551


BrowseDir.h

#include <stdlib.h>
#include <direct.h>
#include <string.h>
#include <string>
#include <io.h>
#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;

class CBrowseDir
{
protected:
	//存放初始目录的绝对路径,以'\'结尾
	char m_szInitDir[_MAX_PATH];

public:
	//缺省构造器
	CBrowseDir();

	//设置初始目录为dir,如果返回false,表示目录不可用
	bool SetInitDir(const char *dir);

	//开始遍历初始目录及其子目录下由filespec指定类型的文件
	//filespec可以使用通配符 * ?,不能包含路径。
	//如果返回false,表示遍历过程被用户中止
	bool BeginBrowse(const char *filespec);
	vector<string> BeginBrowseFilenames(const char *filespec);

protected:
	//遍历目录dir下由filespec指定的文件
	//对于子目录,采用迭代的方法
	//如果返回false,表示中止遍历文件
	bool BrowseDir(const char *dir,const char *filespec);
	vector<string> GetDirFilenames(const char *dir,const char *filespec);
	//函数BrowseDir每找到一个文件,就调用ProcessFile
	//并把文件名作为参数传递过去
	//如果返回false,表示中止遍历文件
	//用户可以覆写该函数,加入自己的处理代码
	virtual bool ProcessFile(const char *filename);

	//函数BrowseDir每进入一个目录,就调用ProcessDir
	//并把正在处理的目录名及上一级目录名作为参数传递过去
	//如果正在处理的是初始目录,则parentdir=NULL
	//用户可以覆写该函数,加入自己的处理代码
	//比如用户可以在这里统计子目录的个数
	virtual void ProcessDir(const char *currentdir,const char *parentdir);
};

BrowseDir.cpp

#include "BrowseDir.h"

CBrowseDir::CBrowseDir()
{
	//用当前目录初始化m_szInitDir
	getcwd(m_szInitDir,_MAX_PATH);

	//如果目录的最后一个字母不是'\',则在最后加上一个'\'
	int len=strlen(m_szInitDir);
	if (m_szInitDir[len-1] != '\\')
		strcat(m_szInitDir,"\\");
}

bool CBrowseDir::SetInitDir(const char *dir)
{
	//先把dir转换为绝对路径
	if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
		return false;

	//转换目录到m_szInitDir下,判断目录是否存在,若目录不存在返回0
	if (_chdir(m_szInitDir) != 0)
		return false;

	//如果目录的最后一个字母不是'\',则在最后加上一个'\'
	int len=strlen(m_szInitDir);
	if (m_szInitDir[len-1] != '\\')
		strcat(m_szInitDir,"\\");

	return true;
}

vector<string> CBrowseDir::BeginBrowseFilenames(const char *filespec)
{
	ProcessDir(m_szInitDir,NULL);
	return GetDirFilenames(m_szInitDir,filespec);
}

bool CBrowseDir::BeginBrowse(const char *filespec)
{
	ProcessDir(m_szInitDir,NULL);
	return BrowseDir(m_szInitDir,filespec);
}

bool CBrowseDir::BrowseDir(const char *dir,const char *filespec)
{
	_chdir(dir);

	//首先查找dir中符合要求的文件
	long hFile;
	_finddata_t fileinfo;
	if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
	{
		do
		{
			//检查是不是目录
			//如果不是,则进行处理
			if (!(fileinfo.attrib & _A_SUBDIR))
			{
				char filename[_MAX_PATH];
				strcpy(filename,dir);
				strcat(filename,fileinfo.name);
				cout << filename << endl;
				if (!ProcessFile(filename))
					return false;
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	//查找dir中的子目录
	//因为在处理dir中的文件时,派生类的ProcessFile有可能改变了
	//当前目录,因此还要重新设置当前目录为dir。
	//执行过_findfirst后,可能系统记录下了相关信息,因此改变目录
	//对_findnext没有影响。
	_chdir(dir);
	if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
	{
		do
		{
			//检查是不是目录
			//如果是,再检查是不是 . 或 .. 
			//如果不是,进行迭代
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name,".") != 0 && strcmp
					(fileinfo.name,"..") != 0)
				{
					char subdir[_MAX_PATH];
					strcpy(subdir,dir);
					strcat(subdir,fileinfo.name);
					strcat(subdir,"\\");
					ProcessDir(subdir,dir);
					if (!BrowseDir(subdir,filespec))
						return false;
				}
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	return true;
}

vector<string> CBrowseDir::GetDirFilenames(const char *dir,const char *filespec)
{
	_chdir(dir);
	vector<string>filename_vector;
	filename_vector.clear();

	//首先查找dir中符合要求的文件
	long hFile;
	_finddata_t fileinfo;
	if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
	{
		do
		{
			//检查是不是目录
			//如果不是,则进行处理
			if (!(fileinfo.attrib & _A_SUBDIR))
			{
				char filename[_MAX_PATH];
				strcpy(filename,dir);
				strcat(filename,fileinfo.name);
				filename_vector.push_back(filename);
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	//查找dir中的子目录
	//因为在处理dir中的文件时,派生类的ProcessFile有可能改变了
	//当前目录,因此还要重新设置当前目录为dir。
	//执行过_findfirst后,可能系统记录下了相关信息,因此改变目录
	//对_findnext没有影响。
	_chdir(dir);
	if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
	{
		do
		{
			//检查是不是目录
			//如果是,再检查是不是 . 或 .. 
			//如果不是,进行迭代
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name,".") != 0 && strcmp
					(fileinfo.name,"..") != 0)
				{
					char subdir[_MAX_PATH];
					strcpy(subdir,dir);
					strcat(subdir,fileinfo.name);
					strcat(subdir,"\\");
					ProcessDir(subdir,dir);
					vector<string>tmp= GetDirFilenames(subdir,filespec);//递归获取子目录文件列表
					for (vector<string>::iterator it=tmp.begin();it<tmp.end();it++)
					{
						filename_vector.push_back(*it);
					}
				}
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	return filename_vector;
}

bool CBrowseDir::ProcessFile(const char *filename)
{
	return true;
}

void CBrowseDir::ProcessDir(const char *currentdir,const char *parentdir)
{
}

StatDir.h

#include "BrowseDir.h"

CBrowseDir::CBrowseDir()
{
	//用当前目录初始化m_szInitDir
	getcwd(m_szInitDir,_MAX_PATH);

	//如果目录的最后一个字母不是'\',则在最后加上一个'\'
	int len=strlen(m_szInitDir);
	if (m_szInitDir[len-1] != '\\')
		strcat(m_szInitDir,"\\");
}

bool CBrowseDir::SetInitDir(const char *dir)
{
	//先把dir转换为绝对路径
	if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
		return false;

	//转换目录到m_szInitDir下,判断目录是否存在,若目录不存在返回0
	if (_chdir(m_szInitDir) != 0)
		return false;

	//如果目录的最后一个字母不是'\',则在最后加上一个'\'
	int len=strlen(m_szInitDir);
	if (m_szInitDir[len-1] != '\\')
		strcat(m_szInitDir,"\\");

	return true;
}

vector<string> CBrowseDir::BeginBrowseFilenames(const char *filespec)
{
	ProcessDir(m_szInitDir,NULL);
	return GetDirFilenames(m_szInitDir,filespec);
}

bool CBrowseDir::BeginBrowse(const char *filespec)
{
	ProcessDir(m_szInitDir,NULL);
	return BrowseDir(m_szInitDir,filespec);
}

bool CBrowseDir::BrowseDir(const char *dir,const char *filespec)
{
	_chdir(dir);

	//首先查找dir中符合要求的文件
	long hFile;
	_finddata_t fileinfo;
	if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
	{
		do
		{
			//检查是不是目录
			//如果不是,则进行处理
			if (!(fileinfo.attrib & _A_SUBDIR))
			{
				char filename[_MAX_PATH];
				strcpy(filename,dir);
				strcat(filename,fileinfo.name);
				cout << filename << endl;
				if (!ProcessFile(filename))
					return false;
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	//查找dir中的子目录
	//因为在处理dir中的文件时,派生类的ProcessFile有可能改变了
	//当前目录,因此还要重新设置当前目录为dir。
	//执行过_findfirst后,可能系统记录下了相关信息,因此改变目录
	//对_findnext没有影响。
	_chdir(dir);
	if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
	{
		do
		{
			//检查是不是目录
			//如果是,再检查是不是 . 或 .. 
			//如果不是,进行迭代
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name,".") != 0 && strcmp
					(fileinfo.name,"..") != 0)
				{
					char subdir[_MAX_PATH];
					strcpy(subdir,dir);
					strcat(subdir,fileinfo.name);
					strcat(subdir,"\\");
					ProcessDir(subdir,dir);
					if (!BrowseDir(subdir,filespec))
						return false;
				}
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	return true;
}

vector<string> CBrowseDir::GetDirFilenames(const char *dir,const char *filespec)
{
	_chdir(dir);
	vector<string>filename_vector;
	filename_vector.clear();

	//首先查找dir中符合要求的文件
	long hFile;
	_finddata_t fileinfo;
	if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
	{
		do
		{
			//检查是不是目录
			//如果不是,则进行处理
			if (!(fileinfo.attrib & _A_SUBDIR))
			{
				char filename[_MAX_PATH];
				strcpy(filename,dir);
				strcat(filename,fileinfo.name);
				filename_vector.push_back(filename);
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	//查找dir中的子目录
	//因为在处理dir中的文件时,派生类的ProcessFile有可能改变了
	//当前目录,因此还要重新设置当前目录为dir。
	//执行过_findfirst后,可能系统记录下了相关信息,因此改变目录
	//对_findnext没有影响。
	_chdir(dir);
	if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
	{
		do
		{
			//检查是不是目录
			//如果是,再检查是不是 . 或 .. 
			//如果不是,进行迭代
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name,".") != 0 && strcmp
					(fileinfo.name,"..") != 0)
				{
					char subdir[_MAX_PATH];
					strcpy(subdir,dir);
					strcat(subdir,fileinfo.name);
					strcat(subdir,"\\");
					ProcessDir(subdir,dir);
					vector<string>tmp= GetDirFilenames(subdir,filespec);//递归获取子目录文件列表
					for (vector<string>::iterator it=tmp.begin();it<tmp.end();it++)
					{
						filename_vector.push_back(*it);
					}
				}
			}
		} while (_findnext(hFile,&fileinfo) == 0);
		_findclose(hFile);
	}
	return filename_vector;
}

bool CBrowseDir::ProcessFile(const char *filename)
{
	return true;
}

void CBrowseDir::ProcessDir(const char *currentdir,const char *parentdir)
{
}

StatDir.cpp

#include "StatDir.h"

//缺省构造器
CStatDir::CStatDir()
{
	//初始化数据成员m_nFileCount和m_nSubdirCount
	m_nFileCount=m_nSubdirCount=0;
}

//返回文件个数
int CStatDir::GetFileCount()
{
	return m_nFileCount;
}

//返回子目录个数
int CStatDir::GetSubdirCount()
{
	//因为进入初始目录时,也会调用函数ProcessDir,
	//所以减1后才是真正的子目录个数。
	return m_nSubdirCount-1;
}

//覆写虚函数ProcessFile,每调用一次,文件个数加1
bool CStatDir::ProcessFile(const char *filename)
{
	m_nFileCount++;
	return CBrowseDir::ProcessFile(filename);
}

//覆写虚函数ProcessDir,每调用一次,子目录个数加1
void CStatDir::ProcessDir(const char *currentdir,const char *parentdir)
{
	m_nSubdirCount++;
	CBrowseDir::ProcessDir(currentdir,parentdir);
}

main.cpp

#include <stdlib.h>
#include <direct.h>
#include <string.h>
#include <string>
#include <io.h>
#include <stdio.h>
#include <vector>
#include <iostream>

#include "StatDir.h"
using namespace std;

int main()
{
	//获取目录名
	char buf[256];
	printf("请输入要统计的目录名:");
	gets(buf);

	//构造类对象
	CStatDir statdir;

	//设置要遍历的目录
	if (!statdir.SetInitDir(buf))
	{
		puts("目录不存在。");
		return 0;
	}

	//开始遍历
	vector<string>file_vec = statdir.BeginBrowseFilenames("*.*");
	for(vector<string>::const_iterator it = file_vec.begin(); 
		it < file_vec.end(); ++it)
	{
		std::cout<<*it<<std::endl;
	}
		
	printf("文件总数: %d\n",file_vec.size());
	printf("子目录数:%d\n", statdir.GetSubdirCount());

	system("pause");
	return 0;
} 


Windows + C++ 获取文件夹中文件名(包括子文件夹) 参考: 1.c/c++ 获取目录下文件列表https://blog.youkuaiyun.com/qq_23845067/article/details/51915200 2.C++ 获取文件夹下的所有文件名https://www.cnblogs.com/fnlingnzb-learner/p/6424563.html 程序 程序一 #include <iostream> #include &lt... 阅读详情

相关推荐

VC++遍历文件夹下的所有文件,包含子目录

使用FindFirstFile、FindNextFile、FindClose进行搜索文件

m0_60352504的博客 1051

c++ 获取指定文件夹下的所有文件夹和子文件夹路径,并打印出来

c++ 获取指定文件夹下的所有文件夹和子文件夹路径,并打印出来使用vs2017 c++17标准注意:最低标准为c++17。

qq_41823532的博客 1553

数字IC/FPGA笔试题收集讨论-华为2022硬件逻辑题题解

华为2022届硬件逻辑 时间2021.7.28 习题题解,收集自网络。

z6026294的博客 6292

c++遍历当前windows目录

设置vs的高级属性为使用多字节字符集,不然会报的错误。

sdhdsf132452的博客 567

从零搭建ROS1导航小车(一):松灵SCOUT Mini底盘通讯配置与ROS包编译避坑指南

本文详细介绍了从零开始搭建ROS1导航小车的初始步骤,重点讲解松灵SCOUT Mini底盘的通讯配置与ROS包编译避坑指南。内容包括硬件连接、CAN通讯配置、ROS工作空间构建及编译优化等实用技巧,帮助开发者快速实现自主导航小车的通讯功能。

weixin_27014595的博客 189

基于单片机控制双向可控硅灯光强度设计

*单片机设计介绍,基于单片机控制双向可控硅灯光强度设计。

QQ2193276455的博客 2458

c++读取指定目录下所有的图片类型文件路径或名称(包含子目录)

c++读取指定目录下所有的图片类型文件类型或名称(包含子目录)c++读取指定目录下所有的图片类型文件类型或名称(包含子目录)前言一、c++读取指定目录下所有的图片类型文件类型或名称(不包含子目录)1.代码2.运行结果二、c++读取指定目录下所有的图片类型文件类型或名称(包含子目录)1.代码2.运行结果总结 c++读取指定目录下所有的图片类型文件类型或名称(包含子目录) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录c++读取指定目录下所有的图片类型文件类型或名称(包含子目录)前

qq_42409710的博客 2395

安装matlab_Matlab+yalmip+cplex安装教程及算例

数学建模/科研学习推荐学习软件:Matlab+yalmip+cplex安装教程及算例其实绝大多数本科生都是在用Matlab和LINGO求解优化问题,Matlab可以求解一般优化问题,但是当优化问题规模比较大或者在应对一些非线性问题时候,Matlab会出现求解时间长,求解效率低,甚至难以求解等问题。Matlab+yalmip+cplex是Matlab通过调用商业软件cplex求解,求解时间短,这里简...

weixin_28939637的博客 5008

查找目录下所有文件及子目录

#include "windows.h" void FindFilesInDir(TCHAR* rootDir) { WIN32_FIND_DATA fd; ZeroMemory(&fd, sizeof(WIN32_FIND_DATA)); HANDLE hFile; TCHAR tmpPath[256]; TCHAR subPath[256]; ZeroMemory(tmpPat

liumu1209的专栏 985

详解Unity中的粒子系统Particle System (二)

上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指正。

梦小天幼的博客 1万+

AI应用架构师进阶:智能控制系统架构的多Agent设计

本文将从“AI应用架构师”的视角,系统讲解智能控制系统中多Agent架构的设计方法。理解多Agent系统的核心特性与在智能控制场景中的优势;掌握多Agent架构的设计流程:从需求分析到角色划分、通信设计、决策实现;通过实战案例(智能家居控制场景),手把手带你落地一个多Agent智能控制系统;探讨进阶话题:动态Agent组织、安全性设计、与大语言模型(LLM)的融合等。在多Agent系统中,Agent(智能体)是具备自主决策能力的最小执行单元。

小程序开发 1086

C++ 获取文件夹下的所有文件名

需要加#include #include

芒果布丁00的博客 1575

jeecg-boot getDictItemsByTable接口存在SQL注入漏洞CVE-2024-48307

微信公众号搜索:南风漏洞复现文库该文章 南风漏洞复现文库 公众号首发JeecgBoot 是一款开源的的低代码开发平台。

nnn2188185的博客 334

获取window系统一个目录下所有的文件名(除目录)

最近在在优化一些代码等等,发现之前写的代码可以被替换,特别对于文件操作来说,这些有一些基本的小功能来组成,最简单的获取window下的文件名,可以重复使用,如下: void GetAllFilesFromDirectory(const std::string&dir, std::vector<std::string>& paths) { #ifdef _WIN32 WIN32_FIND_DATA data; HANDLE hf = FindFirstFile((dir +

weixin_43851636的博客 614

rk3588 适配以太网(百兆)

虽然 RK3588 的 GMAC 控制器原生支持千兆速率(10/100/1000 Mbps),但在某些工业控制、物联网网关或成本敏感型硬件设计中,开发者会选择将其配置为 百兆以太网(Fast Ethernet) 模式。

weixin_35723192的博客 222

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c/c++ 命令行小工具实现列举目录下子文件、获取文件属性

【萌新笔记】通过主函数参数传递路径,列举目录下子文件、递归遍历、获取文件属性。

duoluka的博客 1863

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

获取选取目录下的所有文件名包含子目录下的所有文件名

//------------------------------------------------------------------------ //获取该路径下的所有文件路径 封装调用的函数 void getFiles(string path, vector<string>& files) { //文件句柄 //long hFile = 0; //win7 i...

hm成长之路 1299

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

c++遍历目录和子目录文件

void GetAllFiles(char* lpPath, std::vector&lt;wstring&gt; &amp;fileList){ char szFind[MAX_PATH]; string strRootPath = lpPath;  //根路径 WIN32_FIND_DATA FindFileData; memset(szFind, 0, MAX_PATH); strcpy(s...

xiazai1527的专栏 594

c++ 获取当前路径下的所有文件夹名

目的:获取part_4路径下的所有文件夹名:‘000000’、‘000001’、,,, #include "dirent.h" // 获取所有文件夹 void Face_Select::findFile(string szDir, vector<string> &fileVec) { DIR *dir; struct dirent *ent; dir = ope...

xiakj的专栏 1816

C++遍历目录

【代码】C++遍历目录。

qq_37923517的博客 674

c++ 文件操作

1 获取某个目录下的下的所有文件 2 删除相应目录 #include <iostream> #include<Windows.h> #include<atlstr.h> #include<vector> #include<string> using namespace std; //根据文件夹路径得到文件夹下的图片名称 ve...

SenPaul的博客 202

C/C++遍历目录下的所有文件

1. 遍历某个目录下的所有文件 遍历某个目录下的所有文件,并输出文件名和文件大小。 #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;windows.h&gt; void listFiles(const char * dir); int main() { using namespace std; ...

QtHalcon 3004

windows下c++新建文件夹

windows下c++新建文件夹 #include <direct.h> #include <iostream> using namespace std; int main() { string path= "E:/test/"; if (GetFileAttributesA(path.c_str()) != FILE_ATTRIBUTE_DIRECTORY) { bool flag = CreateDirectory(path.c_str(),

FLYINGong 1735

C++获取一个目录下的所有文件

转自:http://www.yuloo.com/news/1007/448756.html       #include   #include   using namespace std;   void main()   {   _finddata_t file;   long lf;   if((lf = _findfirst("C:\\WINDOWS\\*.*", &fil

发展是曲折的但也是前进的 775

win C++,在当前路径下,获取文件夹名 | 获取所有文件

代码比较通用,记录下放走失

优快云er_2015的博客 2715

c语言 _findfirst() android ndk,C/C++遍历文件夹和文件

struct_finddata_t{unsignedattrib;//文件属性time_ttime_create;//文件创建时间time_ttime_access;//文件上一次访问时间time_ttime_write;//文件上一次修改时间_fsize_tsize;//文件字节数charname[_MAX_FNAME];//文件名};文件属性是无符号整数,取值为相应的宏:_A_ARCH(存档)...

weixin_42590539的博客 1065
上一篇: GitHub for Windows
下一篇: C++输入输出
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值