Manipulación de archivos

Iniciado por Lotux5, 23 Noviembre 2013, 17:01 PM

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

Lotux5

¿Por qué no me funciona el stat?

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

int main(int argc, char *argv[])
{
DIR *dir;
struct dirent *ent;
char **ptr;
long octal;

if( strlen(argv[2]) != 4){
printf("\nError al introducir el numero de digitos del parametro 2\n");
exit(-1);
}

if( (dir=opendir(argv[1]))==NULL){
printf("\nError en el primer open\n");
exit(-1);
}

octal = strtol(argv[2], ptr, 8);

struct stat *atributos;
int fd;
while ((ent = readdir(dir)) != NULL){
if( (strcmp(ent->d_name, ".")!=0) && (strcmp(ent->d_name, "..")!=0) ){
if ( (fd = open(ent->d_name,O_CREAT|O_TRUNC|O_WRONLY,S_IRGRP|S_IWGRP|S_IXGRP))<0){
printf("\nError en el segundo open\n");
exit(-1);
}

printf("%s", ent->d_name);
printf("%s\n", " : ");

if ( (stat(ent->d_name, atributos)) <0){
printf("\nError en stat\n");
exit(-1);
}
chmod(ent->d_name, octal);
close(fd);
}
}


Lotux5

El codigo completo seria este (aunque no funciona):

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

int main(int argc, char *argv[])
{
DIR *dir;
struct dirent *ent;
char **ptr;
long octal;

if( strlen(argv[2]) != 4){
printf("\nError al introducir el numero de digitos del parametro 2\n");
exit(-1);
}

if( (dir=opendir(argv[1]))==NULL){
printf("\nError en el primer open\n");
exit(-1);
}

octal = strtol(argv[2], ptr, 8);

struct stat atributos;
int fd;
while ((ent = readdir(dir)) != NULL){
if( (strcmp(ent->d_name, ".")!=0) && (strcmp(ent->d_name, "..")!=0) ){
if ( (fd = open(ent->d_name,O_RDONLY))<0){
printf("\nError en el segundo open\n");
exit(-1);
}

printf("%s", ent->d_name);
printf("%s", " : ");

if ( (stat(ent->d_name, &atributos)) <0){
printf("\nError en stat\n");
exit(-1);
}

if( (atributos.st_mode & S_IRUSR) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWUSR) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXUSR) != 0)
printf("%s", "x");
else
printf("%s", "-");

if( (atributos.st_mode & S_IRGRP) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWGRP) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXGRP) != 0)
printf("%s", "x");
else
printf("%s", "-");

if( (atributos.st_mode & S_IROTH) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWOTH) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXOTH) != 0)
printf("%s", "x");
else
printf("%s", "-");




printf("%s", " ");

if( (chmod(ent->d_name, octal)) <0){
printf("\nError en chmod\n");
exit(-1);
}



if( (atributos.st_mode & S_IRUSR) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWUSR) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXUSR) != 0)
printf("%s", "x");
else
printf("%s", "-");

if( (atributos.st_mode & S_IRGRP) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWGRP) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXGRP) != 0)
printf("%s", "x");
else
printf("%s", "-");

if( (atributos.st_mode & S_IROTH) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWOTH) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXOTH) != 0)
printf("%s\n", "x");
else
printf("%s\n", "-");



close(fd);
}
}


}

Lotux5

SOLUCIONADO. Por si alguien necesita el código, lo dejo como aporte.

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

int main(int argc, char *argv[])
{
DIR *dir;
struct dirent *ent;
char **ptr;
long octal;

if( strlen(argv[2]) != 4){
printf("\nError al introducir el numero de digitos del parametro 2\n");
exit(-1);
}

if( (dir=opendir(argv[1]))==NULL){
printf("\nError en el primer open\n");
exit(-1);
}

octal = strtol(argv[2], ptr, 8);

struct stat atributos;
int fd;
while ((ent = readdir(dir)) != NULL){
if( (strcmp(ent->d_name, ".")!=0) && (strcmp(ent->d_name, "..")!=0) ){

printf("%s", ent->d_name);
printf("%s", " : ");

if ( (stat(ent->d_name, &atributos)) <0){
printf("\nError en stat\n");
exit(-1);
}

if( (atributos.st_mode & S_IRUSR) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWUSR) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXUSR) != 0)
printf("%s", "x");
else
printf("%s", "-");

if( (atributos.st_mode & S_IRGRP) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWGRP) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXGRP) != 0)
printf("%s", "x");
else
printf("%s", "-");

if( (atributos.st_mode & S_IROTH) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWOTH) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXOTH) != 0)
printf("%s", "x");
else
printf("%s", "-");




printf("%s", " ");

if( (chmod(ent->d_name, octal)) <0){
printf("\nError en chmod\n");
exit(-1);
}

if ( (stat(ent->d_name, &atributos)) <0){
printf("\nError en stat\n");
exit(-1);
}



if( (atributos.st_mode & S_IRUSR) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWUSR) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXUSR) != 0)
printf("%s", "x");
else
printf("%s", "-");

if( (atributos.st_mode & S_IRGRP) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWGRP) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXGRP) != 0)
printf("%s", "x");
else
printf("%s", "-");

if( (atributos.st_mode & S_IROTH) != 0)
printf("%s", "r");
else
printf("%s", "-");

if( (atributos.st_mode & S_IWOTH) != 0)
printf("%s", "w");
else
printf("%s", "-");

if( (atributos.st_mode & S_IXOTH) != 0)
printf("%s\n", "x");
else
printf("%s\n", "-");


}
}


}