
Forumul dedicat sistemului de operare Ubuntu în România
Forumul Ubuntu România
Forumul de discuții și asistență al comunității Ubuntu din România
Forumul dedicat sistemului de operare Ubuntu în România
Forumul de discuții și asistență al comunității Ubuntu din România
Neautentificat.
Am nevoie de ajutor pentru a scrie in C un program care primeste ca argument in linia de comanda un director si calculeaza suma dimensiunilor fisierelor din arborescenta cu originea in el. SO este linux.
Daca ma poate ajuta cineva, as fi foarte recunoscator.
Offline
JoeyMoey a scris:
Am nevoie de ajutor pentru a scrie in C un program care primeste ca argument in linia de comanda un director si calculeaza suma dimensiunilor fisierelor din arborescenta cu originea in el. SO este linux.
Daca ma poate ajuta cineva, as fi foarte recunoscator.
Eu te-as ajuta, dar cu Romana nu prea sunt la zi.
Ce anume vrei tu sa faci acolo? Sa calculezi "suma dimensiunilor fisierelor din arborescenta cu originea in el.". Nu inteleg intrebarea.
Adica ceva ve face comanda DU ?
du -sh fisier
Offline
Descarci de aici sursa la baobab http://packages.ubuntu.com/precise/gnome/baobab modifici pe ici pe colo si ai facut
un program in C , mai simplu de atit nu se poate.
Offline
STAT este cea ce ai tu nevoie.
Un exemplu:
#include <stdio.h> #include <sys/stat.h> int main(void){ struct stat file; if(stat("/home/tara24/test_file" ,&file) < 0){ return 1; } printf("Information for %s\n","/home/tara24/test_file"); printf("---------------------------\n"); printf("File Size: \t\t%ld bytes\n",file.st_size); printf("Number of Links: \t%ld\n",file.st_nlink); printf("File inode: \t\t%ld\n",file.st_ino); printf("File Permissions: \t"); printf( (S_ISDIR(file.st_mode)) ? "d" : "-"); printf( (file.st_mode & S_IRUSR) ? "r" : "-"); printf( (file.st_mode & S_IWUSR) ? "w" : "-"); printf( (file.st_mode & S_IXUSR) ? "x" : "-"); printf( (file.st_mode & S_IRGRP) ? "r" : "-"); printf( (file.st_mode & S_IWGRP) ? "w" : "-"); printf( (file.st_mode & S_IXGRP) ? "x" : "-"); printf( (file.st_mode & S_IROTH) ? "r" : "-"); printf( (file.st_mode & S_IWOTH) ? "w" : "-"); printf( (file.st_mode & S_IXOTH) ? "x" : "-"); printf("\n\n"); printf("The file %s a symbolic link\n", (S_ISLNK(file.st_mode)) ? "is" : "is not"); return 0; }
Output:
Information for /home/tara24/test_file
---------------------------
File Size: 12144 bytes
Number of Links: 1
File inode: 1570525
File Permissions: -rwxr-xr-x
The file is not a symbolic link
Daca vrei si alte lucruri cum ar fi ultima modificare a fisirului:
#include <stdio.h> #include <sys/stat.h> #include <time.h> void getFileTime(const char *path) ; int main(void){ getFileTime ("/home/tara24/test_file"); } void getFileTime(const char *path) { struct stat attr; stat(path, &attr); printf("Last accessed time:\t\t%s", ctime(&attr.st_atime)); printf("Last modified time:\t\t%s", ctime(&attr.st_mtime)); printf("Last status change time:\t%s", ctime(&attr.st_ctime)); }
Output:
Last accessed time: Fri Jan 6 14:17:53 2017
Last modified time: Fri Jan 6 14:17:44 2017
Last status change time: Fri Jan 6 14:17:44 2017
OFF:
Imi explica si mie cineva ce inseamna ==>> "suma dimensiunilor fisierelor din arborescenta cu originea in el."
Editat ultima oară de TARA24. (06 Jan 2017 15:22:44)
Offline
Vrea program cu un argument spre exemplu in /home sa caute fisiere si sa faca suma acestora, sau cel putin asa am inteles eu.
Offline
bula20 a scris:
sau cel putin asa am inteles eu.
Sunt si eu curios de asta.
@JoeyMoey
Iti dai seama ca nu o sa iti facem noi tema de casa, nu?
Aici ai un program care face ce vrei tu, insa doar pe un Fisier, iti ramane tie sa gandesti cum se cisteste un Director si cum aduni acele fisier.
80% din munca ti-am facut-o eu:
#include <stdlib.h> #include <string.h> #include <stdio.h> #include <sys/stat.h> size_t my_strrchr(const char *ptr, const char delimiter); char *getPath(const char *ptr); void checkBuffer(const char *ptr); long int getFileSize(const char *ptr); int main(int argc, char *argv[]) { if (argc != 2) { char *path = getPath(argv[0]); printf("Usage: .%s argument\n",path); free(path); return 1; } long int fileSize = getFileSize(argv[1]); printf("File size in Bytes is = %ldB\n", fileSize); printf("File size in KB is = %.2fK\n", (float)fileSize / 1024.0); return 0; } size_t my_strrchr(const char *ptr, const char delimiter){ checkBuffer(ptr); size_t i = 0; size_t ret = 0; while( ptr[i] != '\0' ){ if ( ptr[++i] == delimiter ){ ret = i; } } return ret; } char *getPath(const char *ptr){ checkBuffer(ptr); size_t i=0; size_t ret = my_strrchr(ptr, '/'); char *pathTmp = malloc( 512 ); char *pathRet = NULL; memset(pathTmp, 0, 512); if( pathTmp == NULL){ printf("Error, malloc.\n"); exit(EXIT_FAILURE); } while ( ptr[ret] != '\0'){ pathTmp[i++] = ptr[ret++]; } pathRet = realloc(pathTmp, i+1); pathRet[i] = '\0'; if(pathRet){ return pathRet; }else{ return pathTmp; } } long int getFileSize(const char *ptr){ checkBuffer(ptr); long int fileSize; FILE *file; file = fopen (ptr , "r" ); if (file == NULL){ fputs ("File error",stderr); fclose (file); exit (1); } fseek (file , 0 , SEEK_END); fileSize = ftell (file); rewind (file); fclose (file); return fileSize; } void checkBuffer(const char *ptr){ if (ptr == NULL ){ printf("Error, NULL Pointer\n"); exit(EXIT_FAILURE); } if ( *ptr == '\0' ){ printf("Error, the Buffer is Empty\n"); exit(EXIT_FAILURE); } }
Output1:
tara24@tara24-HP-Pavilion-17-Notebook-PC ~ $ ./program
Usage: ./program argument
Output2:
tara24@tara24-HP-Pavilion-17-Notebook-PC ~ $ ./program my_test_file
File size in Bytes is = 16568B
File size in KB is = 16.2K
DU spune acelasi Lucru:
tara24@tara24-HP-Pavilion-17-Notebook-PC ~ $ du -b my_test_file
16568 my_test_file
Bafta
Editat ultima oară de TARA24. (06 Jan 2017 20:08:16)
Offline
Din pacate problema este mai complexa, poti descarca coreutils
apt source coreutils
Dupa care te uiti la du.c care este sursa lui du, trust me nu este asa simplu.
Offline