ricardoneves93 0 Denunciar mensagem Publicado 25 de Março de 2013 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 http://www.speedtest.net/result/2682095343.png Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 25 de Março de 2013 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 0 Denunciar mensagem Publicado 25 de Março de 2013 Desconhecia esta função, obrigado pela ajuda http://www.speedtest.net/result/2682095343.png Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
ricardoneves93 0 Denunciar mensagem Publicado 27 de Março de 2013 (editado) 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 27 de Março de 2013 por ricardoneves93 http://www.speedtest.net/result/2682095343.png Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 27 de Março de 2013 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 0 Denunciar mensagem Publicado 28 de Março de 2013 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; } http://www.speedtest.net/result/2682095343.png Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 28 de Março de 2013 (editado) 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 28 de Março de 2013 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
ricardoneves93 0 Denunciar mensagem Publicado 28 de Março de 2013 Pois, já entendi estou a fazer stat() ao directório e não aos ficheiros que estão dentro dele. Como posso fazer aos ficheiros que estão lá dentro? http://www.speedtest.net/result/2682095343.png Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pmg 96 Denunciar mensagem Publicado 28 de Março de 2013 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 0 Denunciar mensagem Publicado 28 de Março de 2013 (editado) 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 28 de Março de 2013 por ricardoneves93 http://www.speedtest.net/result/2682095343.png Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites