Quota a deleni souboru

Ondrejicka Stefan ondrej na idata.sk
Pondělí Září 29 14:34:21 CEST 1997


Caj.

On Mon, 29 Sep 1997, Michal Polak wrote:
> Neznate/nemate nekdo nastroj, ktery by rozdeloval soubor a pritom jej
> postupne umazaval ? 
> 
> Nerad bych to delal ve smycce pomoci head atd., protoze mi to pripada
> neefektivni (zbytecne zatizeny disk). Idealni by bylo provest
> toto rozdeleni jednim (nejvyse dvema) pruchodem po zdrojovem souboru.

vid zdrojak co som teraz ubastlil.
prvy parameter je subor a druhy velkost useku v bajtoch.

> P.S. Kdyby mel nekdo napad, jak to zprogramovat, rad se necham poucit.
> Potiz je samozrejme v tom, jak zkratit soubor bez nutnosti dokopirovavani
> zbytku souboru.

Najlepsie je v takomto pripade zacat od konca a pouzit truncate() alebo
ftruncate() ako som to aj urobil.

Maj sa.
---
Ondrejicka Stefan    <ondrej na idata.sk>
Beethovenova 11 ,917 08 Trnava ,Slovakia
------------- další část ---------------
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <limits.h>

main(argc , argv)
int argc;
char **argv;
{
	struct stat estat;
	char pom[PATH_MAX];
	char buf[8192];
	int len;
	int csize , psize , tsize;
	int cnr;
	int cfd,pfd;

	if (stat(argv[1] , &estat))
	{
		perror(argv[1]);
		exit(1);
	}
	psize = atoi(argv[2]);
	tsize = estat.st_size;
	if ((pfd = open(argv[1] , O_RDWR)) < 0)
	{
		perror(argv[1]);
		exit(2);
	}
	cnr = 0;
	while (tsize)
	{
		csize = (tsize > psize) ? psize : tsize;
		lseek(pfd , tsize - csize , SEEK_SET);	
		sprintf(pom , "%s.%d" , argv[1] , cnr); 
		cfd = open(pom , O_CREAT | O_WRONLY , S_IRUSR | S_IWUSR);
		if (cfd < 0)
		{
			perror(pom);
			exit(3);	
		}
		while((len = read(pfd , buf , sizeof(buf))) > 0)
		{
			if (write(cfd , buf , len) != len)
			{
				perror(buf);
				close(cfd);
				exit(4);
			}
		}
		close(cfd);
		tsize -= csize;
		cnr ++;
		ftruncate(pfd , tsize);		
	}
	close(pfd);
}



Další informace o konferenci Linux