Novell Home

How to create many files

From Developer Community

A nice platform-neutral program that can be used to create a large amount of files for testing purposes.

Sample Code

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

#define DEFAULT_FILE_SIZE 10

int main( int argc, char* argv[]) {
	size_t dirlen;
	char* directory;
	int files;
	int filesize;
	int i;
	if ( argc < 3 || argc > 4) {
		printf( "Usage: %s <directory> <files> [<filesize>]\n"
			"where\n"
			"<directory> is an existing directory\n"
			"<files> - number of files to create\n"
			"<filesize> - size of each file (can be 0). By default it is equal to %d\n"
			"Example:\n"
			"%s VOL2:\\manyfils 10000\n", argv[ 0], DEFAULT_FILE_SIZE, argv[ 0]);
		return EXIT_FAILURE;
	}
	dirlen = strlen( argv[ 1]);
	directory = malloc( dirlen + sizeof( INT_MAX) + 2);
	if ( directory == NULL) {
		puts( "Out of memory");
		return EXIT_FAILURE;
	}
	memcpy( directory, argv[ 1], dirlen); /* not zero-terminated, it's ok */
	if ( dirlen == 0 ||( directory[ dirlen - 1] != '/' && directory[ dirlen - 1] != '\\')) {
		directory[ dirlen] = '\\';
		++dirlen;
	}
	files = atoi( argv[ 2]);
	filesize = ( argc == 4) ? atoi( argv[ 3]) : DEFAULT_FILE_SIZE;
	printf( "directory = %.*s, files = %d, filesize = %d\n", dirlen, directory, files, filesize);
	for ( i = 0; i < files; ++i) {
		FILE* f;
		int j;
		sprintf( directory + dirlen, "%d", i);
		/* puts( directory); */
		if ( i != 0 && i % 1000 == 0) {
			printf( "%d files created so far\n", i);
		}
		f = fopen( directory, "wb");
		if ( f == NULL) {
			perror( "fopen");
			free( directory);
			return EXIT_FAILURE;
		}
		for ( j = 0; j < filesize; ++j) {
			if ( fputc( j, f) == EOF) {
				perror( "fputc");
				fclose( f);
				free( directory);
				return EXIT_FAILURE;
			}
		}
		fclose( f);
	}
	free( directory);
	return EXIT_SUCCESS;
}

--Dmitry Mityugov

Novell® Making IT Work As One

© 2008 Novell, Inc. All Rights Reserved.