测试专用,跨平台批量生成指定大小及个数的文件(非稀疏文件)

最近有点不爽,心里不痛快,一个东东搞了很久了还没搞好,耐心都快弄没了,火大。不提这个了,写了个批量生成目录文件和指定大小的

文件的东西用于测试分享下。顺便看了下稀疏文件相关的东东,这个在另一篇了。


效果大致如下 :



功能没得什么说的,直接附上代码: 

/*************************************************
Author: xiongchuanliang
Description: 批量生成指定大小,指定个数的文件,及子目录
g++ -o test custsize.cpp 
**************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#if defined(WIN32)
	#include <Windows.h>
	#include <Winioctl.h>
	#include <direct.h> 
	#include <io.h>
#else
	#include <sys/stat.h>
	#include <sys/types.h>
	#include <unistd.h> 
	#include <errno.h>
	#include <fcntl.h>
#endif

//生成的文件的文件名后缀
#define FILE_SUFFIX ".log"

// 生成不存存的子目录
int createdir(char * sdirname)
{
	int ret = 0 ;
	if(sdirname == NULL) return 1;
#if defined(WIN32)
	if( _access(sdirname,NULL)!=0 )
	{
		if(_mkdir(sdirname) != 0 )
		{
			printf("ERR mkdir 错误码:%d\n",GetLastError());
			return -1;
		}
	}
#else
	if( access(sdirname,F_OK)!=0 )
	{
		if( mkdir(sdirname,0755) == -1 )
		{
			//perror("ERR mkdir error ");			
			printf("ERR mkdir 错误码:%d\n",errno);
			return -1;
		} 
	}
#endif
	return 0;
}

//生成指定大小的文件
int testfile(char * sdirname,	 //当前目录
			 const int prefix,   //文件前缀
			 const int filenum , //当前目录需生成文件个数
			 const long setsize, //文件大小
			 const long fcount,  //总文件个数
			 long &cfcount)      //已生成数
{
	char scfilename[500] = {0};
	if(sdirname == NULL) return 1;

	for(int k=0;k<filenum;k++)
	{
		
#if defined(WIN32)
       sprintf(scfilename,"fsutil file createnew %s/%d_%d%s %d ",
			sdirname,prefix,k + 1,FILE_SUFFIX,setsize);
		
#else
		//创建指定大小非稀疏文件
		//fallocate -o 0 -l 1024m /u01/a.log
        sprintf(scfilename,"fallocate -o 0 -l %dk %s/%d_%d%s ",
        	setsize,sdirname,prefix,k + 1,FILE_SUFFIX);
#endif
        system(scfilename);
		cfcount++;
		printf("\n进度[ %d / %d ] \n", cfcount,fcount);
		memset(scfilename,0,sizeof(char)*500);
	}
	return 0;
}

//生成子目录,及测试文件
int testdir(char * sdirname,	//当前目录
			const int dirlevel ,//目录层次
			const int dirnum,	//子目录数
			const int filenum , //当前目录需生成文件个数
			const long setsize, //文件大小
			const long fcount)  //已生成数
{
	char sclevel[500] = {0};
	char schilddir[500] = {0};
	long cfcount = 0;
	if(sdirname == NULL) return 1;
	if( createdir(sdirname) != 0 ) return 1;
	for(int i=0;i< dirlevel;i++)
	{
		sprintf(sclevel,"%s/%d",sdirname,i + 1);
		if( createdir(sclevel) != 0 ) return 1;
		if( testfile(sclevel,i+1,filenum,setsize,fcount,cfcount) != 0 )return 1;
		for(int j=0;j<dirnum;j++)
		{
			sprintf(schilddir,"%s/%d",sclevel,j + 1);
			if( createdir(schilddir) != 0 ) return 1;
			if( testfile(schilddir,j+1,filenum,setsize,fcount,cfcount) )return 1;
			memset(schilddir,0,sizeof(char)*500);
		}
		memset(sclevel,0,sizeof(char)*500);
	}
	return 1;
}

//输入条件
int test()
{
	char type;
	char sdirname[500] = {0};
	long block,filesize,setsize;
	int  dirnum,dirlevel,filenum,fcount;

	printf("------------------------批量生成工具------------------------\n\n");
	printf("待创建主目录:");
	scanf("%s",sdirname);
	printf("\n子目录层数:");
	scanf("%d",&dirlevel);
	printf("\n每层子目录数:");
	scanf("%d",&dirnum);
	printf("\n每层子目录文件数:");
	scanf("%d",&filenum);
	printf("\n每个文件大小(单位:k,m,g):");
	scanf("%d%c",&filesize,&type);
	//printf("\n是否为稀疏文件(sparse-files) 请选y或n:");
	//scanf("%d",&filetype);
	switch(type)
	{
	case 'K':
	case 'k':
		block = 1024;
		break;
	case 'M':
	case 'm':
		block = 1024 * 1024;
		setsize = filesize * block ;
		break;
	case 'G':
	case 'g':
		block = 1024 * 1024 * 1024;
		break;
	default:
		printf("文件大小设置有误. 应为1024k这种方式输入。\n");
		return -1;
		break;
	}
	setsize = filesize * block ;
	fcount = dirnum * dirlevel * filenum + dirlevel * filenum;
	printf("--------------------------------\n");
	printf("文件总数: %d \n",fcount);
	printf("总大小  : %d %c \n",fcount * filesize,type);
	printf("--------------------------------\n\n");
	testdir(sdirname,dirlevel,dirnum,filenum,setsize, fcount );
	printf("\n全部生成完毕.\n");
	return 0;
}


int main(void)
{
	test();
#if defined(WIN32)
	system("pause");
#endif
	return 0;
}

创建的是非稀疏文件,UNIX/Linux下没找到合适的方法,找了三四种全是稀疏文件文件的,就不管了。反正目前测试了Windows下也够用了。

 对于Windows下创建指定文件,用得 fsutil 命令,要是不想弄这个,用代码实现,也可做到。 附个例子:

/*************************************************
Author: xiongchuanliang
Description: Windows下生成指定大小的文件,非稀疏文件
**************************************************/

#include <stdlib.h>
#include <stdio.h>

#include <Windows.h>
#include <Winioctl.h>
#include <direct.h> // _mkdir
#include <io.h>

void PrintError(DWORD dwErr) {
	char szMsg[256];
	DWORD dwFlags = FORMAT_MESSAGE_IGNORE_INSERTS |
		FORMAT_MESSAGE_MAX_WIDTH_MASK |
		FORMAT_MESSAGE_FROM_SYSTEM;
	if (!::FormatMessageA(dwFlags, NULL, dwErr, 0, szMsg, sizeof(szMsg), NULL)) strcpy(szMsg, "Unknown error.");
	printf(szMsg);
	printf("\n");
}

int testfile()
{
	HANDLE hFile ;
	DWORD dwWriteaddr = 0;
	DWORD dwRet =0,dwFPos = 0;
	BOOL bRet = FALSE;
	hFile = CreateFileA("C:\\xcl\\demo3.txt",GENERIC_READ|GENERIC_WRITE,
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		NULL,
		CREATE_ALWAYS,
		0,
		NULL);
	if(hFile == INVALID_HANDLE_VALUE)
	{
		printf("创建文件失败!\n");
		PrintError(GetLastError());
		return 1;
	}

	//生成指定大小的文件
	// 0x100000 = 1048576 = 1 MB
	dwFPos = SetFilePointer(hFile,0x100000,NULL,FILE_BEGIN);
	if (dwFPos == INVALID_SET_FILE_POINTER)
	{
		printf("SetFilePointer发生错误.\n");
		PrintError(GetLastError());
		return 1;
	}

	bRet = WriteFile(hFile,"XCL\0",4,&dwWriteaddr,NULL);
	if (!bRet)
	{
		printf("WriteFile发生错误.\n");
		PrintError(GetLastError());
		return 1;
	}

	//除了在文件最末尾会有"XCL"这三个字符外,其它部份将会被填上0,实实在在的占用系统空间.
	dwFPos = SetEndOfFile(hFile);
	if (dwFPos == INVALID_SET_FILE_POINTER)
	{
		printf("SetEndOfFile发生错误.\n");
		PrintError(GetLastError());
		return 1;
	}

	CloseHandle(hFile);
	return 0;
}

int main(void)
{
	testfile();

	system("pause");

	return 0;
}

用上面的方法就够了。 如果要稀疏文件生成方法的,可以看我后一篇:稀疏文件(sparse-files) 生成汇总


附注:  fsutil 命令查看盘信息的写法。

C:\Documents and Settings\Administrator>fsutil fsinfo volumeinfo c:\
卷名 : WINXP
卷序列号 : 0x88f16579
组件长度最大值 : 255
文件系统名 : FAT32
保留文件名的大小写
支持文件名中的 Unicode
C:\Documents and Settings\Administrator>fsutil fsinfo volumeinfo d:\
卷名 : Install
卷序列号 : 0xcf722f5
组件长度最大值 : 255
文件系统名 : NTFS
支持区分大小写的文件名
保留文件名的大小写
支持文件名中的 Unicode
保留并加强 ACL
支持基于文件的压缩
支持磁盘配额
支持稀疏文件
支持重分析点
支持对象标识符
支持加密文件系统
支持带有名称的数据流



MAIL:xcl_168@aliyun.com

BLOG: http://blog.csdn.net/xcl168




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值