Ir ao conteúdo
  • Cadastre-se

C++


Visitante

Posts recomendados

Olá galera que manja de C

Será que alguém pode me ajudar???

Preciso de uma função para gerar estatística de ultilização de area em disco por usuário. É urgente please.

[ ]'s

Link para o comentário
Compartilhar em outros sites

Pois não...

Veja o código em C:


/*    dsize.c      
(by Daniel K. O.)
Mostra o tamanho de um diret¢rio
Compilado no MinGW
*/

#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <dir.h>
#include <string.h>

unsigned long DirSize(char *dir) {
    struct _finddata_t ff;  /* "ffblk" no compilador da Borland */
    char separador;
    unsigned long DirBytes = 0;
    char buff[FILENAME_MAX], buff2[FILENAME_MAX];
    int l, fh;

    separador = (dir[strlen(dir)-1]=='\\') ? '\0' : '\\';
    /* verifica se o último caracter é uma barra '\\'     */

    strcpy(buff, dir);
    l=strlen(buff);

    buff[l]=separador; /* coloca o separador ('\0' ou '\\')
                        * no final da string */
    buff[l+1]='\0';    /* e, obviamente, assegura que ela foi finalizada,
                        * com um '\0' */
    strcpy(buff2, buff);
    strcat(buff2, "*.*");

    if (!(fh=_findfirst(buff2, &ff)))
       if (ff.attrib!=_A_SUBDIR)  /* ff_attrib no Borland C */
          DirBytes+=ff.size;  /* ff_fsize no Borland C */
       else
         if (strcmp(ff.name, ".") && strcmp(ff.name, "..")) {
         /* ff_name no Borland C */
            strcpy(buff2, buff);
            strcat(buff2, ff.name);  
            DirBytes+=DirSize(buff2);
         }

    while (!_findnext(fh, &ff)) {  /* findnext() retorna 0 enquanto achar
                                     * algo no diret¢rio*/
          if (ff.attrib!=_A_SUBDIR)  
             DirBytes+=ff.size;  
          else
              if (strcmp(ff.name, ".") && strcmp(ff.name, "..")) {
                 strcpy(buff2, buff);
                 strcat(buff2, ff.name);
                 DirBytes+=DirSize(buff2);
              }
    }
   
    _findclose(fh);  /* pode não ser necessário no Borland C */
    return DirBytes;
}


int main(int argc, char *argv[]) {

    if (argc!=2) {
       printf("Mostra o tamanho de um diretório\n");
       printf("Formato: dsize diretorio\n");
       exit(1);
    }

    printf ("%lu bytes\n", DirSize(argv[1]));

    return 0;
}

Fiz esse código prá compilar no MinGW, prá Windows. Não é padrão ANSI/ISO C, por isso tem diferenças entre os compiladores. Coloquei comentários nos pontos que apresentam divergências, então é melhor conferir o help do seu compilador (e os arquivos io.h e dir.h (dos.h também, se tiver)) para saber os nomes das funções e constantes. Lembrando que em sistemas *nix pode ser necessário mais alterações ainda.

Se analisar a função DirSize, ela apenas faz uma análise recursiva para pegar cada arquivo do diretório e somar o seu tamanho ao tamanho total; quando ela achar algum subdiretório, ela chama a si própria novamente, passando como parâmetro o novo diretório encontrado; a função _findclose() pode ser desnecessária dependendo da implementação que você for usar (se ela não existir, é porque não precisa mesmo :P ).

Até mais.

PS:

:)  :(  :D  :P  ;)  ???  :-0  :angry:  }:)  :-(P  d-:  :Zz  :69  :??????'>  (:-D  :((  :**  :Z  :!!!  8D  :::)  :C  :))))  :-?)  #-()  $-)  88-)  ;-|  B-)  :-/  9-N  !-)  :-09  :-Baaa  :-V

Hm... quantos desses emoticons tão realmente funcionando??

Link para o comentário
Compartilhar em outros sites

Valeu a força. Já me deu uma grande força. Estou indo bem estou fazendo algumas implementações e ajustes ainda na função qualquer problema eu retorno c/ mais algumas dúvidas.

[ ]´s

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...