Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ricardoneves93

Copiar ficheiros em Linux

Mensagens Recomendadas

ricardoneves93

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Em POSIX (Unix, Linux, ...) tens a funcao readdir() (and friends) que te ajudam no teu projecto.


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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ricardoneves93

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;

}

Editado por ricardoneves93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ricardoneves93

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;

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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 */
 /* ... */
}

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ricardoneves93

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?

Editado por ricardoneves93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.