Estou fazendo um mini programazinho em console com c++. Em fim estou precisando de saber se uma pasta especifica está vazia ou contem ficheiros cpp\c++.
Obrigado desde já por toda a ajuda.
O exemplo abaixo --- f1-1216
--- tem o mínimo do que precisa. Compile com ao menos C++17
e se usa o compilador da Microsoft use /Za
por causa do not
C:\TEMP> tree . /F
Listagem de caminhos de pasta
O número de série do volume é 0000006C 7E52:1BF2
C:\TEMP
│ cmake_install.cmake
│ f1-1216.exe
│ f1-1216.ilk
│ f1-1216.pdb
│ vc140.pdb
│
└───CMakeFiles
└───f1-1216.dir
embed.manifest
f1.cpp.obj
intermediate.manifest
manifest.rc
manifest.res
vc140.pdb
PS C:\TEMP> ./f1-1216 CMakeFiles
Usando "CMakeFiles"
Diretorio corrente: "C:\\TEMP"
Na pasta:
"CMakeFiles\\f1-1216.dir" [diretorio]
PS C:\TEMP> ./f1-1216
Usando "."
Diretorio corrente: "C:\\TEMP"
Na pasta:
".\\CMakeFiles" [diretorio]
".\\cmake_install.cmake" [arquivo comum]
".\\f1-1216.exe" [arquivo comum]
".\\f1-1216.ilk" [arquivo comum]
".\\f1-1216.pdb" [arquivo comum]
".\\vc140.pdb" [arquivo comum]
PS C:\TEMP>
Dentro da pasta TEMP
tem alguns arquivos e outra pasta, CMakeFiles
.
O programa aceita um argumento na linha de comando, obviamente a pasta. Se não receber nenhum considera o diretório corrente, "."
.
#include <filesystem>
#include <iostream>
int main(int argc, char** argv)
{
namespace sa = std::filesystem; // sistema de arquivos
sa::path dir{"."};
if (argc > 1) dir = argv[1]; // se veio uma pasta
std::cout << "Usando " << dir << "\n";
std::cout << "Diretorio corrente: " << sa::current_path() << "\n";
// encerra se nao for um diretorio
if (not sa::is_directory(dir))
{
std::cout << " NAO e' um diretorio\n";
return -1;
}
// diretorio: esta vazio?
if (sa::is_empty(dir))
{
std::cout << " diretorio vazio!\n";
return 0;
}
// diretorio nao vazio: lista o conteudo
const char* tipo[] = {"arquivo comum", "diretorio"};
std::cout << "\n\tNa pasta:\n\n";
for (auto const& arq : sa::directory_iterator{dir})
std::cout << arq <<
"\t[" << tipo[sa::is_directory(arq)] << "]\n";
return 0;
}