Como faço para diferenciar o resultado das funções stat() ou access() da biblioteca unistd.h [RESOLV

1. Como faço para diferenciar o resultado das funções stat() ou access() da biblioteca unistd.h [RESOLV

Michel Dionisio Silva
micheldionisio

(usa Ubuntu)

Enviado em 20/06/2018 - 19:55h

Testei vários códigos para testar a existencia de arquivos em um diretório, assunto extensamente já discutido no forum, porém o meu problema é que eventualmente um aplicativo externo cria diretórios no mesmo PATH que monitoro para ler os arquivos , e as funções tanto a stat() quanto a access() identifica tanto arquivo como diretório como sendo o mesmo objeto. Ex: quando o código encontra um diretório as funções devolvem OK dizendo que o arquivo existe, porém ela não está testando um arquivo ... e sim um diretório. Mas não consigo diferenciar pelas funções ....
A ultima função que utilizei no teste foi a access() mas a stat() também gera o mesmo resultado.

Segue a função chamada:
int fileAccess(char* pathAndfileName)
{
int val;
/* Verifica se arquivo existe */
val = access (pathAndfileName, F_OK);
if (val == 0){
return 1;
printf("Arquivo existe!!!");
}
else{
return 0;
}
}

Dentro da minha função main() chamo o teste com esse código:
int TstFile;
TstFile = fileAccess(f);
if (TstFile){
printf ("Processando arquivo: %s\n", f);
//printf ("Movendo arquivo %s para pasta processados.\n", f);
}else{
printf("A entrada %s é um diretorio e não será processada!\n", f);
}

E em todas as situações, quando é lida uma entrada de diretório ou quando é lida uma entrada de um arquivo, independente de qual das funções é utilizada, o retorno é sempre o mesmo: que o arquivo existe!!! Eu preciso diferenciar os diretórios para excluí-los do tratamento. Não usei fopen(), porque a demanda de leitura de arquivos é muito grande no meu sistema e a abertura dos arquivos iria gerar um custo muito grande para o processamento.

Se alguem tiver alguma dica, agradeço muito. Obrigado.


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 20/06/2018 - 21:02h

#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, cahr **argv){
// Recebe uma lisa de arquivos pela linha de comando, vê
// se cada um deles existe, e indica seu tipo.
if(argc<=1)
return 0;
struct stat st;
while(--argc){
printf("%s: ", ++argv);
if(lstat(++argv, &st)==-1)
printf("erro: %s\n", strerror(errno));
else if(S_ISREG(st.st_mode))
printf("arquivo comum\n");
else if(S_ISDIR(st.st_mode))
printf("diretório\n");
else if(S_ISCHR(st.st_mode))
printf("dispositivo orientado a caracteres\n");
else if(S_ISBLK(st.st_mode))
printf("dispositivo orientado a blocos\n");
else if(S_ISFIFO(st.st_mode))
printf("named pipe (fifo)\n");
else if(S_ISLNK(st.st_mode))
printf("link simbólico\n");
else if(S_ISSOCK(st.st_mode))
printf("socket\n");
else
printf("tipo desconhecido.\n");
}
return 0;
}


3. Re: Como faço para diferenciar o resultado das funções stat() ou access() da biblioteca unistd.h [RESOLV

Diego Mendes Rodrigues
diegomrodrigues

(usa Ubuntu)

Enviado em 20/06/2018 - 21:29h

Michel,

Segue um programa em Linguagem C que deve te atender.
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
if(argc != 2) {
printf("Qual o arquivo será analizado?\n");
return 4;
}

struct stat fileStat;

if(stat(argv[1],&fileStat) < 0) {
printf("O arquivo não existe\n");
return 1;
} else if (S_ISLNK(fileStat.st_mode)) {
printf("O arquivo é link simbólico\n");
return 2;
} else if (S_ISDIR(fileStat.st_mode)) {
printf("O arquivo é um diretório\n");
return 3;
} else {
printf("Arquivo comum\n");
return 0;
}
}

Abraço,
Diego M. Rodrigues


4. Tópico: Como faço para diferenciar o resultado das funções stat() ou access() da biblioteca unistd.h

Michel Dionisio Silva
micheldionisio

(usa Ubuntu)

Enviado em 21/06/2018 - 01:08h

Obrigado Paulo1205 e obrigado Diegomrodrigues. As sugestões deram certo. Não tinha visto que na struct stat tinham campos que me traziam essa informação pronta. Bastou testar usando as macros pre definidas S_ISDIR e S_ISREG sobre o campo da struct st_mode e baseado no teste alterei o retorno da função, pois ela sempre retorna true, então tive que alterar o valor do retorno quando o objeto era arquivo e quando era diretório. Mas o principal que era distringuir arquivo e diretório está bombando. Muito obrigado.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts