+ Responder ao Tópico



  1. #1

    Padrão Algumas duvidas de C

    Pessoal prescisava saber em C como fazer pra ler o tamanho de um arquivo e imprimir na tela e ler o conteudo e imprimir na tela, e tb como fazer um programinha que veja se um arquivo existe no diretorio usando opendir, readdir e closedir, qq ajuda é bme vinda.

    vlw a todos

  2. #2

    Padrão Algumas duvidas de C

    Pessoal so pra upar que to prescisando isso meio urgente pra hj, vlw

    falows

  3. #3

    Padrão Algumas duvidas de C

    esse eh um pedaco de um program q fiz uma cara...
    (mudei um pouco... tirei o inutil... sei la se as variaveis fileNameIn e fullPathFile estao 100% corretas com a mudanca... mas #odase, da pra entender)

    Código :
    funcao_pra_abrir_um_arquivo_de_diretorio(){
     
    DIR *dirIn = {0};
    struct dirent *dirInEnt = {0};
    char fileNameIn[DTHCFG_PATH_SIZE + 1] = "/tmp", fullPathFile[512] = {0};
    struct stat currFileReaded = {0};
     
     
    dirIn = opendir((const char *)fileNameIn);
    if(dirIn == NULL){
       printf("Problema em abrir diretorio de entrada! [%s]", strerror(errno));
       return(DTH_ERRO);
    }
     
    /* readdir() retorna NULL em 2 casos: fim de leitura do diretorio (E nao muda o valor
     * de errno!) e quando houve erro, setando um valor diferente de 0 para errno. Com isso,
     * iremos diferenciar os dois retornos NULLs possiveis.
     */
    errno = 0;
     
    /* Lendo o conteudo do diretorio, iremos descartar arquivos ".", ".." e diretorios */
    while((dirInEnt = readdir(dirIn)) != NULL){
       memset(fullPathFile, 0, 512);
     
       strcpy((char *)fullPathFile, (const char *)fileNameIn);
       strcat((char *)fullPathFile, dirInEnt->d_name);
       if(stat((char *)fullPathFile, &currFileReaded) == -1){
          printf("Erro em pegar status do aruqivo [%s]: [%s].", fullPathFile, strerror(errno));
       }
     
       if((strcmp((const char *)dirInEnt->d_name, ".")  == 0) || (strcmp((const char *)dirInEnt->d_name, "..") == 0)){
          continue;
       }
     
       if((S_ISDIR(currFileReaded.st_mode) == 0) && (S_ISREG(currFileReaded.st_mode) != 0)){
          break;
       }
     
    }
     
    if((dirInEnt == NULL) && (errno != 0)){ /* Problema com readdir() */
       printf("Impossivel abrir arquivo no path [%s]: [%s].", fileNameIn, strerror(errno));
       memset(fileNameIn, 0, DTHCFG_PATH_SIZE);
       closedir(dirIn);
       return(DTH_ERRO);
    }
     
    if(dirInEnt == NULL){ /* readdir() chegou no fim e nao informou existencia de arquivo */
       printf("Nao foi localizado arquivo de Demanda no path [%s].", fileNameIn);
       memset(fileNameIn, 0, DTHCFG_PATH_SIZE);
       closedir(dirIn);
       return(DTH_ERRO);
    }
     
    strncat((char *)fileNameIn, (const char *)dirInEnt->d_name, DTHCFG_PATH_SIZE-strlen((const char *)fileNameIn));
     
    if(access((char *)fileNameIn, R_OK|F_OK) == -1){
       printf("Acesso ao arquivo [%s] nao eh possivel: [%s].",
                       fileNameIn, strerror(EACCES));
       /* free(dirInEnt); ??? */
       memset(fileNameIn, 0, DTHCFG_PATH_SIZE); /* Evita exclusao */
       closedir(dirIn);
       return(DTH_ERRO);
    }
     
    if((*fdIn = open((const char *)fileNameIn, O_RDONLY|O_CREAT|O_LARGEFILE)) == -1){
       printf("Erro em abrir arquivo [%s] IGNORADA! Motivo: [%s]." fileNameIn, strerror(errno));
       /* free(dirInEnt); ??? */
       memset(fileNameIn, 0, DTHCFG_PATH_SIZE); /* Evita exclusao */
       closedir(dirIn);
       return(DTH_ERRO);
    }
     
    printf("Abrindo arquivo de Demanda [%s] aberto." fileNameIn);
     
    /* free(dirInEnt); ??? */
    closedir(dirIn);
     
    return(DTH_OK);
    }

    ps: aproveitando, alguem sabe se devo fazer free(dirInEnt)?
    de resto, [man 2 access] e [man 2 stat] e 'See also' explica.