Jump to content
ricardoneves93

Copiar ficheiros em Linux

Recommended Posts

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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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;

}

Edited by ricardoneves93

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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;

}

Share this post


Link to post
Share on other 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 */
 /* ... */
}

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!

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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?

Edited by ricardoneves93

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.