您的位置:首页 > 其它

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

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

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

效果大致如下 :



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

/*************************************************
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fsutil 指定大小 批量