Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal, estou tentando ler arquivos de diretórios para encontrar arquivos, o problema é que eu não encontrei nada nessa biblioteca para saber se o que eu tenho é um arquivo ou diretório, Exemplo:


int main(int argc, char* argv[])
{
DIR* dir;
struct dirent* entrada = 0;
unsigned char is_file = 0x4;
unsigned char is_dir = 0x8;

string arquivo;

cout << "Arquivo >> ";
cin >> arquivo;

dir = opendir(arquivo.c_str());

if(dir == 0)
{
cout<<"Não foi possivel abrir o arquivo: "<<arquivo<<"."<<endl;
system("pause");
exit(0);
}

while(entrada = readdir(dir))
{
cout<<"___ARQUIVO___"<<endl;
cout<<entrada->d_name<<endl;
cout<<entrada->d_ino<<endl;
cout<<entrada->d_namlen<<endl;
cout<<entrada->d_reclen<<endl;
cout<<"___FIM____"<<endl<<endl<<endl;
}

closedir(dir);

return 0;
}

ele apenas carrega algumas informações, mas o que eu preciso saber é se é um diretório ou arquivo, para fazer busca em diretórios dentro de diretórios.

Alguém sabe como fazer isso?

  • 7 anos depois...
Postado
Em 30/03/2013 às 12:20, Shoxsz disse:

Olá pessoal, estou tentando ler arquivos de diretórios para encontrar arquivos, o problema é que eu não encontrei nada nessa biblioteca para saber se o que eu tenho é um arquivo ou diretório, Exemplo:

 

 


int main(int argc, char* argv[])
{
    DIR* dir;
    struct dirent* entrada = 0;
    unsigned char is_file = 0x4;
    unsigned char is_dir = 0x8;

    string arquivo;

    cout << "Arquivo >> ";
    cin >> arquivo;

    dir = opendir(arquivo.c_str());

    if(dir == 0)
    {
        cout<<"Não foi possivel abrir o arquivo: "<<arquivo<<"."<<endl;
        system("pause");
        exit(0);
    }

    while(entrada = readdir(dir))
    {
        cout<<"___ARQUIVO___"<<endl;
        cout<<entrada->d_name<<endl;
        cout<<entrada->d_ino<<endl;
        cout<<entrada->d_namlen<<endl;
        cout<<entrada->d_reclen<<endl;
        cout<<"___FIM____"<<endl<<endl<<endl;
    }

    closedir(dir);

    return 0;
}

 

ele apenas carrega algumas informações, mas o que eu preciso saber é se é um diretório ou arquivo, para fazer busca em diretórios dentro de diretórios.

Alguém sabe como fazer isso?

Boa noite, 

o programa abaixo talvez resolva o teu problema. 

#include <stdint.h>
#include <string.h>
#include <dirent.h>
#include <shlwapi.h>
#include <stdio.h>

#include "Menu.h"
#pragma comment(lib,"shlwapi.lib")

void listFile(int size, const char *path)
{
    DIR *dir = NULL;
    struct dirent *slist = NULL;
    signed char aux_path[256];

    dir = opendir(path);

    if(dir == NULL)
    {
        printf("\n**********************************\n");
        printf("Failed to open the file\n");
        printf("**********************************\n");
    }
    while(( slist = readdir(dir))!= NULL)
    {
        if(strcmp(".", slist->d_name) == 0 || strcmp("..", slist->d_name)== 0)
            continue;

         printf("%.*s%s\n",size,"--------------------------------",slist->d_name);
         sprintf(aux_path,"%s\\%s",path,slist->d_name);
         if(PathIsDirectoryA(aux_path))
         {
            listFile(5+size,aux_path);
         }
    }
    closedir(dir);
}

void ControleListFile(void)
{
    int size,leave;
    int size_str = 0;
    char path[100];
    char str1[20];
    char str2[20];

    while(1)
    {
        strcpy(str1,"C:\\\\");
        strcpy(str2, "\\\\");

        size = menu(&path);


        size_str = strlen(path);
        strncat(str1,path,size_str);
        size_str = strlen(str1);
        strncat(str1,str2,size_str);

        strcpy(path,str1);

        listFile(size,path);

        printf("\n**********************************\n");
        printf("\nWant to leave\n");
        printf("(1) - YES\n");
        printf("(2) - NO\n");
        leave = getInt();
        printf("**********************************\n");

        if(leave == 1)
           break;
    }

}

 

 

Postado

dirent foi escrita para manipular diretórios. Não precisa de dirent para isso. Use o simples: fstat() ou stat() e veja o que tem em st_mode... 

 

STAT(2)  Linux Programmer's Manual   STAT(2)

NAME
       stat, fstat, lstat, fstatat - get file status

SYNOPSIS
       #include <sys/types.h>
       #include <sys/stat.h>
       #include <unistd.h>

       int stat(const char *pathname, struct stat *statbuf);
       int fstat(int fd, struct stat *statbuf);
       int lstat(const char *pathname, struct stat *statbuf);

       #include <fcntl.h> /* Definition of AT_* constants */
       #include <sys/stat.h>

       int fstatat(int dirfd, const char *pathname,
                   struct stat *statbuf,
                   int flags);

 

Tem o macro IS_DIR()... Que plataforma está usando?

 

Em C++ isso é coisa do mais distante passado... C++ implementa filesystem. Basta incluir... É muito bem escrita --- opinião pessoal --- e tem funções para tudo. Por exemplo dá para escrever filtros e varrer todo o sistema de arquivos em algo como 8 linhas de programa. Em Linux ou Windows.

 

Veja um programa complexo, ou nem tanto

 

#include <filesystem>
#include <iostream>
int main (void)
{
    if ( std::filesystem::is_directory("C:/Windows") )
        std::cout << "\"C:\\Windows\" eh um diretorio\n";
}

 

Que mostra
 

PS C:\src\ifdef>
PS C:\src\ifdef> 
PS C:\src\ifdef> g++ -o teste -std=c++17 c1312.cpp
PS C:\src\ifdef> ./teste
"C:\Windows" eh um diretorio
PS C:\src\ifdef>
PS C:\src\ifdef> 

 

Em windows, claro.

 

Em 30/03/2013 às 12:20, Shoxsz disse:

Alguém sabe como fazer isso?

 

O simples seria escrever uma classe e usar filesystem. Mas a solução anos 80 funciona perfeitamente: use fstat() na raiz das pastas e a partir daí use as funções em dirent.

Outra opção comum, muito comum até ter filesystem em C++ eu postei aqui no ano passado. Acho que foi um programa em C ou C++, usando como documentado aqui para Windows apenas. Usando findfirst() e findnext(). Em https://docs.microsoft.com/pt-br/cpp/c-runtime-library/filename-search-functions?view=msvc-160 tem um exemplo em C. Ou encontre aqui o programa que eu postei, pesquisando no conteúdo que eu postei. Tem uma função no forum eu acho

 

Exemplo (NÃO USE)
 

int Pasta::apaga_recursivo(string pasta)
{
	// a partir da origem apaga 'pasta' e seu conteudo
	// recursivamente.
	cout << "\n\n==> apaga_recursivo(\"" << 
		pasta << "\")\n";
	if (P.find(pasta) == P.end())
	{
		cout << "\n\tapaga_recursivo(\"" <<
			pasta << "\"): nao encontrada\n";
		return -1;
	};	// if()
	cout << "Pasta: " << pasta << "\t" <<
		P[pasta].size() << " vezes\n";
	// corre a lista de pastas com esse nome
	for (const auto& p : P[pasta])
		cout << setw(10) << p.size << "\t" << p.P << endl;

	for (const auto& p : P[pasta])
	{
		try
		{
			if(remove_all(p.P))
				cout << "\t" << p.P.filename() <<
					" directory is gone" << endl;
		}
		catch ( const filesystem::filesystem_error& e )
		{
			cerr << e.what();
			cout << "\t" << p.P.filename() <<
				" NOT removed!" << endl;
		};	// try
	};
	return 0;
};	 

 

Simples assim. Mas isso estava dentro de algo que tinha muitos testes e tal. É só pra ler. NÃO USE. Isso apaga TODAS as pastas e o conteúdo delas, desde que tenham esse nome e estejam dentro da pasta especificada. Era para destruir um certo tipo de pastas de teste em umas máquinas de desenvolvimento.

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...