Problema al acceder a un directorio en C

Iniciado por Frijolito, Noviembre 24, 2018, 09:02:58 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Noviembre 24, 2018, 09:02:58 PM Ultima modificación: Noviembre 27, 2018, 08:11:03 PM por xyz
Hola, tengo un pequeno problema que llevo mucho todo el dia tratando de solucionar.  Lo que pasa es que intento acceder a un directorio y me manda un error violación de segmento voy a dejar una foto:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Tambien ejecute el programa como "sudo ./xor" y tampoco funciona probablemente  sea un error pequeno pero de verdad no logro encontrar el porque.

Gracias de antemano.
Código: c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>

void Direc();
void FileSize(char *fileN);
void Cifrar(char *fileN);

int main(){

Direc();
return 0;
}

void Cifrar(char *fileN){

char c;
int clave;

clave = rand()% 255 + 0;

FILE *file;
file = fopen(fileN, "rb+");

int i = 0;
while((c = fgetc(file)) != EOF){
fseek(file, i, SEEK_SET);
i++;
fputc((c ^ clave), file);
}
i = 0;
fclose(file);
printf("   Crifrado. \n");
}

void Direc(){

char *ndir;
char *p=getenv("USER");

printf(" [>>] Introduca el directorio: \n");
printf("  %s~$: ",p);
scanf("%s", ndir);
printf("%s\n",ndir);

DIR *dir;
struct dirent *ent;
dir = opendir(ndir);

if(dir == NULL){
printf("  [>>] Error al buscar el directorio \n");
}

while((ent = readdir(dir)) != NULL){
if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){
}
FileSize(ent->d_name);
}
}

void FileSize(char *fileN){

long ftam = -1;
FILE *file;
file = fopen("fileN", "r");

if(file){
fseek(file, 0L, SEEK_END);
ftam = ftell(file);
fclose(file);
printf("%30s (%ld bytes)",fileN, ftam);
}
Cifrar(fileN);
}

Noviembre 24, 2018, 09:46:06 PM #1 Ultima modificación: Noviembre 24, 2018, 09:48:43 PM por solid water
Frijolito hasta el lunes no estoy en casa y no puedo probar nada, pero quería decirte algo.
En esta parte del código:

 
Código: c
 while((ent = readdir(dir)) != NULL){
                if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){
                }
                FileSize(ent->d_name);
        }


Tu quieres decir que si es el . o el .. el archivo no haga nada pero sin embargo de todas modos llamas al FileSize, por que debería ser así:

   
Código: c
while((ent = readdir(dir)) != NULL){
                if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){
                 
                      FileSize(ent->d_name);
                }
               
        }


Saludos recién el lunes a la tarde/noche podría probarlo.
Igual no sé si es eso lo que querías hacer.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Frijolito hasta el lunes no estoy en casa y no puedo probar nada, pero quería decirte algo.
En esta parte del código:

 
Código: c
 while((ent = readdir(dir)) != NULL){
                if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){
                }
                FileSize(ent->d_name);
        }


Tu quieres decir que si es el . o el .. el archivo no haga nada pero sin embargo de todas modos llamas al FileSize, por que debería ser así:

   
Código: c
while((ent = readdir(dir)) != NULL){
                if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){
                 
                      FileSize(ent->d_name);
                }
               
        }


Saludos recién el lunes a la tarde/noche podría probarlo.
Igual no sé si es eso lo que querías hacer.

Gracias no me di cuenta de ese error pero aun así no deja acceder a ningún directorio directorio y no se porque es

Frijolito le arreglé varias cosas, ya no crashea y funciona el cifrado, lo que no está devolviendo, es el filesize.
Pero el código corre y cifra.
Lo del FileSize te toca a vos.

Código: c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>

void Direc();
void FileSize(char  fileN[200]);
void Cifrar(char fileN[200]);

int main(){

        Direc();
        return 0;
}

void Cifrar(char fileN[200]){


        char c;
        int clave;

        clave = rand()% 255 + 0;


        FILE *file;
        file = fopen(fileN, "rb+");

        int i = 0;
        while((c = fgetc(file)) != EOF){
                fseek(file, i, SEEK_SET);
                i++;
                fputc((c ^ clave), file);
        }
        i = 0;
        fclose(file);
        printf("   Crifrado. \n");

}

void Direc(){

        char ndir[200];
        char *p=getenv("USER");

        printf(" [>>] Introduca el directorio: \n");
        printf("  %s~$: ",p);
        scanf("%s", ndir);

        printf("%s\n",ndir);

        DIR *dir;
        struct dirent *ent;
        dir = opendir(ndir);

        if(dir == NULL){
                printf("  [>>] Error al buscar el directorio \n");
        }

        while((ent = readdir(dir)) != NULL){
                if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){

                        printf("%s", ent->d_name);
                        strcat(ndir,ent->d_name);       
                        FileSize(ndir);
               }

        }
}

void FileSize(char fileN[200]){

        long ftam = -1;
        FILE *file;
        file = fopen("fileN", "r");

        if(file){
                fseek(file, 0L, SEEK_END);
                ftam = ftell(file);
                fclose(file);
                printf("%30s (%ld bytes)",fileN, ftam);
        }else{
                printf("no file \n");
        }
        Cifrar(fileN);
}


Después si querés hablamos por MP.

Saludos,