/* Disc usage helpers * Builds on DrvUnused() and Size() */ I64 ClusChainLen(CDrv *dv, I64 c) { I64 n=0,max; max=(dv->size+dv->drv_offset - dv->data_area)/dv->spc; while(0<c<0x0ffffff8 && n<=max) { n++; c=ClusNumNext(dv,c); } return n; } I64 ClusBytes(U8 drv_let=0) { CDrv *dv=Let2Drv(drv_let); return dv->spc*BLK_SIZE; } I64 DrvUsed(U8 drv_let=0) { CDrv *dv=Let2Drv(drv_let); return dv->size*BLK_SIZE-DrvUnused(drv_let); } public I64 DuFile(U8 *filename) { CDirEntry de; I64 res=0; if(FileFind(filename,&de,FUF_JUST_FILES)) { res=CeilU64(de.size,ClusBytes(*de.full_name)); Free(de.full_name); } return res; } public I64 Du(U8 *dirname=".") { U8 *abs=DirNameAbs(dirname),*mask; CDrv *dv=Let2Drv(*abs); CDirEntry de; I64 cb=dv->spc*BLK_SIZE,res; if(StrLen(abs)<=3)//"C:/" mask=MStrPrint("%s*",abs); else mask=MStrPrint("%s/*",abs); res=Size(mask,"+r",cb); if(dv->fs_type==FSt_FAT32) { if(StrLen(abs)<=3) { res+=ClusChainLen(dv,dv->root_clus)*cb; } else if (FileFind(abs,&de,FUF_JUST_DIRS)) { res+=ClusChainLen(dv,de.clus)*cb; Free(de.full_name); } } Free(mask); Free(abs); return res; } public U0 DuRep(U8 *dirname=".") { U8 *abs=DirNameAbs(dirname); "\n\n%s: %,d kiB on disk (cluster %d bytes)\n", abs,Du(abs)/1024,ClusBytes(*abs); "Drive %C: %,d MiB used, %,d MiB free\n\n", *abs,DrvUsed(*abs)/1024/1024,DrvUnused(*abs)/1024/1024; Free(abs); }