ricardoneves93 Posted March 25, 2013 at 08:57 PM Report #500361 Posted March 25, 2013 at 08:57 PM 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
pmg Posted March 25, 2013 at 09:19 PM Report #500365 Posted March 25, 2013 at 09:19 PM 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!
ricardoneves93 Posted March 25, 2013 at 09:38 PM Author Report #500367 Posted March 25, 2013 at 09:38 PM Desconhecia esta função, obrigado pela ajuda 😉 http://www.speedtest.net/result/2682095343.png
ricardoneves93 Posted March 27, 2013 at 03:26 PM Author Report #500587 Posted March 27, 2013 at 03:26 PM (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 March 27, 2013 at 04:16 PM by ricardoneves93 http://www.speedtest.net/result/2682095343.png
pmg Posted March 27, 2013 at 07:09 PM Report #500611 Posted March 27, 2013 at 07:09 PM 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!
ricardoneves93 Posted March 28, 2013 at 01:26 PM Author Report #500682 Posted March 28, 2013 at 01:26 PM 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
pmg Posted March 28, 2013 at 02:15 PM Report #500688 Posted March 28, 2013 at 02:15 PM (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 March 28, 2013 at 02:16 PM 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!
ricardoneves93 Posted March 28, 2013 at 02:51 PM Author Report #500696 Posted March 28, 2013 at 02:51 PM 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
pmg Posted March 28, 2013 at 02:55 PM Report #500698 Posted March 28, 2013 at 02:55 PM 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!
ricardoneves93 Posted March 28, 2013 at 03:12 PM Author Report #500700 Posted March 28, 2013 at 03:12 PM (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 March 28, 2013 at 03:12 PM by ricardoneves93 http://www.speedtest.net/result/2682095343.png
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now