最近有点不爽,心里不痛快,一个东东搞了很久了还没搞好,耐心都快弄没了,火大。不提这个了,写了个批量生成目录文件和指定大小的
文件的东西用于测试分享下。顺便看了下稀疏文件相关的东东,这个在另一篇了。
效果大致如下 :
功能没得什么说的,直接附上代码:
/************************************************* 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 命令查看盘信息的写法。
MAIL:[email protected]
BLOG: http://blog.csdn.net/xcl168