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