Jump to content

Recommended Posts

Posted

Boa noite, tenho que fazer um pequeno programa que tem como função copiar todos os ficheiros que estão dentro de uma pasta ou directório. Eu sei como copiar um ficheiro de dentro de uma pasta para outra pasta, só não estou a ver como verifico se existe ou não mais ficheiros dentro dessa pasta, podem-me dar uma opinião?

Cumprimentos, Ricardo

Posted (edited)

Estou a tentar obter os nomes de todos os ficheiros dentro de uma pasta, mas não quero detectar subpastas, porém este código está a fazer printf do nome das subpastas desse directório.

if(S_IFDIR(buf.st_mode) == 0), este if não deveria tratar disso?

#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <error.h>
int readContent(char *pth)
{
char path[1000];
char name[100];
strcpy(path,pth);
DIR *dp;
struct dirent *files;
if((dp = opendir(path)) == NULL)
 perror("dir\n");
struct stat buf;
while((files = readdir(dp)) != NULL)
{
 if(S_ISDIR(buf.st_mode) == 0) // então é um ficheiro
  {
if((strcmp(files->d_name,".") != 0) && (strcmp(files->d_name,"..") !=0))
{
 strcpy(name,files->d_name);
 printf("%s\n", name);
}
  }


}
}

int main(int argc, char *argv[])
{
readContent(argv[1]);
return 0;

}
Edited by ricardoneves93
Posted

if(S_IFDIR(buf.st_mode) == 0), este if não deveria tratar disso?

No teu codigo nunca actualizas buf! A variavel tem um valor desconhecido, que nao podes usar.

Hint: falta-te chamar a funcao stat().

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Já estou a usar a função stat para actualizar os dados da estrutura stat, porém não o está a fazer só está a aceder a um ficheiro especifico dentro do directório path, fiz um teste para obter a data de modificação e reparei que apenas está a guardar na estrutura os dados de apenas esse ficheiro....

#include <sys/stat.h>
#include <dirent.h>
#include <error.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
char* readContent(char *pth)
{
char path[1000];
char name[100];
char dateAfter[20];
int numFiles = 0;
strcpy(path,pth);
DIR *dp;
struct dirent *files;
if((dp = opendir(path)) == NULL)
 perror("dir\n");
struct stat buf;
while((files = readdir(dp)) != NULL)
{ stat(path, &buf);
 if(S_ISDIR(buf.st_mode) != 0) // então é um ficheiro
  {
   strftime(dateAfter, sizeof dateAfter, "%Y_%m_%d_%H_%M_%S", localtime(&buf.st_mtime));
   printf("%s\n", dateAfter);
   if((strcmp(files->d_name,".") != 0) && (strcmp(files->d_name,"..") !=0))
   {
 strcpy(name,files->d_name);
 printf("%s\n", name);
 //return name;
   }
  }


}
printf("%d\n", numFiles);
}

int main(int argc, char *argv[])
{
char name[100];
strcpy(name, readContent(argv[1]));
//printf("%s\n", name);
return 0;

}
Posted (edited)

Já estou a usar a função stat ...

while((files = readdir(dp)) != NULL)
{ stat(path, &buf);
 /* ... */
}

Verifica a que é que estás a fazer o stat()

while((files = readdir(dp)) != NULL)
{ stat(path, &buf);
 printf("DEBUG: Fiz stat() a %s\n", path); /* VERIFICACAO */
 /* ... */
}
Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Tens que usar files->d_name ...

while((files = readdir(dp)) != NULL)
{
 printf("DEBUG: readdir() encontrou o nome %s\n", files->d_name); /* usar valor do readdir() */
 stat(path, &buf);
 printf("DEBUG: Fiz stat() a %s\n", path); /* VERIFICACAO */
 /* ... */
}

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted (edited)

O primeiro printf vai-me dar o nome do ficheiro que foi 'lido' porem o segundo printf está-me a dar sempre o nome apenas do directório, portanto a conclusão que eu tiro daqui é que tenho que mudar o path a cada iteração, por exemplo 1ª iteração stat(directorio/ficheiro1, &buf), 2ª iteração stat(directorio/ficheiro2, &buf) e assim sucessivamente, certo?

Edited by ricardoneves93

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.