Quiero obtener los nombres de archivo de todos los archivos que tienen una extensión específica en una carpeta determinada (y recursivamente, sus subcarpetas). Es decir, el nombre del archivo (y la extensión), no la ruta completa del archivo. Esto es increíblemente simple en lenguajes como Python, pero no estoy familiarizado con los constructos para esto en C++. ¿Cómo puede hacerse esto?¿Cómo obtener la lista de archivos con una extensión específica en una carpeta determinada?
Respuesta
#define BOOST_FILESYSTEM_VERSION 3
#define BOOST_FILESYSTEM_NO_DEPRECATED
#include <boost/filesystem.hpp>
namespace fs = ::boost::filesystem;
// return the filenames of all files that have the specified extension
// in the specified directory and all subdirectories
void get_all(const fs::path& root, const string& ext, vector<fs::path>& ret)
{
if(!fs::exists(root) || !fs::is_directory(root)) return;
fs::recursive_directory_iterator it(root);
fs::recursive_directory_iterator endit;
while(it != endit)
{
if(fs::is_regular_file(*it) && it->path().extension() == ext) ret.push_back(it->path().filename());
++it;
}
}
@ namar0x0309 He aplicado su edición, eso es correcto. – Gigi
allí, esta es la respuesta portátil. –
Lo único que no funcionó para mí es el 'y', lo reemplacé por '&&'. El resto es excelente. +1 –
No dice en qué sistema operativo está, pero hay varias opciones.
Como han mencionado los comentaristas, boost::filesystem funcionará si puede usar boost.
Otras opciones son
En las ventanas que hacer algo como esto:
void listFiles(const char* path)
{
struct _finddata_t dirFile;
long hFile;
if ((hFile = _findfirst(path, &dirFile)) != -1)
{
do
{
if (!strcmp(dirFile.name, "." )) continue;
if (!strcmp(dirFile.name, ".." )) continue;
if (gIgnoreHidden)
{
if (dirFile.attrib & _A_HIDDEN) continue;
if (dirFile.name[0] == '.') continue;
}
// dirFile.name is the name of the file. Do whatever string comparison
// you want here. Something like:
if (strstr(dirFile.name, ".txt"))
printf("found a .txt file: %s", dirFile.name);
} while (_findnext(hFile, &dirFile) == 0);
_findclose(hFile);
}
}
En POSIX, como Linux o OSX:
void listFiles(const char* path)
{
DIR* dirFile = opendir(path);
if (dirFile)
{
struct dirent* hFile;
errno = 0;
while ((hFile = readdir(dirFile)) != NULL)
{
if (!strcmp(hFile->d_name, "." )) continue;
if (!strcmp(hFile->d_name, "..")) continue;
// in linux hidden files all start with '.'
if (gIgnoreHidden && (hFile->d_name[0] == '.')) continue;
// dirFile.name is the name of the file. Do whatever string comparison
// you want here. Something like:
if (strstr(hFile->d_name, ".txt"))
printf("found an .txt file: %s", hFile->d_name);
}
closedir(dirFile);
}
}
Sus soluciones encontrarían el archivo en el patrón, "foo.txt.exe". No consideraría que tener una extensión .txt. –
En Windows, ¿dónde está configurando el valor de "gIgnoreHidden". ¿Es una bandera? – hshantanu
sí - es un booleano global en el ejemplo. Pero realmente puedes hacer cualquier cosa aquí, como pasarlo como otro argumento para listFiles. –
obtener la lista de archivos y proceso de cada archivo y lazo a través ellos y almacenar en otra carpeta
void getFilesList(string filePath,string extension, vector<string> & returnFileName)
{
WIN32_FIND_DATA fileInfo;
HANDLE hFind;
string fullPath = filePath + extension;
hFind = FindFirstFile(fullPath.c_str(), &fileInfo);
if (hFind != INVALID_HANDLE_VALUE){
returnFileName.push_back(filePath+fileInfo.cFileName);
while (FindNextFile(hFind, &fileInfo) != 0){
returnFileName.push_back(filePath+fileInfo.cFileName);
}
}
}
USO: se puede utilizar como esta carga todos los archivos de la carpeta y el bucle a través de uno en uno
String optfileName ="";
String inputFolderPath ="";
String extension = "*.jpg*";
getFilesList(inputFolderPath,extension,filesPaths);
vector<string>::const_iterator it = filesPaths.begin();
while(it != filesPaths.end())
{
frame = imread(*it);//read file names
//doyourwork here (frame);
sprintf(buf, "%s/Out/%d.jpg", optfileName.c_str(),it->c_str());
imwrite(buf,frame);
it++;
}
un código C++ 17
#include <fstream>
#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
std::string path("/your/dir/");
std::string ext(".sample");
for(auto& p: fs::recursive_directory_iterator(path)
{
if(p.path().extension() == ext())
std::cout << p << '\n';
}
return 0;
}
- 1. ¿Cómo obtener la lista de archivos de una carpeta específica en el almacenamiento interno?
- 2. Buscar recursivamente archivos con una extensión específica
- 3. Obtener archivos en una carpeta
- 4. Obtener una lista de archivos de TFS
- 5. ¿Cómo copio archivos con una extensión de archivo específica a una carpeta en mi script python (versión 2.5)?
- 6. Mercurial: Olvídese de archivos de una determinada extensión
- 7. Impedir el acceso a archivos en una carpeta determinada
- 8. ¿Cómo obtener la lista de todos los archivos con extensión ESY en un directorio?
- 9. Obtener un identificador de tipo uniforme para una extensión determinada
- 10. Rubí lista de archivos excluir una carpeta
- 11. descomprimir solo la extensión específica
- 12. lista de archivos Ponerse en una carpeta en C
- 13. Android, ¿cómo puedo obtener una lista de todos los archivos en una carpeta?
- 14. ¿Está asociada una aplicación con una extensión determinada?
- 15. Cómo obtener la lista de archivos que se vieron afectados desde una revisión específica en Mercurial
- 16. Cómo obtener una lista de archivos con errores en PhpStorm
- 17. Buscar un archivo con una cierta extensión en la carpeta
- 18. Agregue automáticamente archivos a SVN dentro de una carpeta específica
- 19. C# ¿La mejor manera de obtener la profundidad de la carpeta para una ruta determinada?
- 20. cómo encontrar archivos en una rama determinada
- 21. ¿Cómo puedo descomprimir una carpeta específica?
- 22. ¿Cómo obtener la lista de clases derivadas de una clase determinada, con RTTI mejorado?
- 23. ¿Cómo creo un paquete que copie todos los archivos de una carpeta determinada en una nueva carpeta?
- 24. Obtener una lista de archivos con la ruta completa
- 25. ¿Cómo activo la lista de directorios en una carpeta IIS específica a través de web.config?
- 26. Lista de archivos modificados desde una fecha determinada utilizando SVN
- 27. Asignación de una carpeta específica a HttpHandler en web.config
- 28. Cómo obtener una compilación específica con la API de TFS
- 29. fuentes desactivar buscar una carpeta específica en NetBeans 7.1 RC2
- 30. Deshabilitar indexación intellij en una carpeta específica
[ 'impulso :: filesystem'] (http://www.boost.org/doc/libs/1_41_0/libs/filesystem/doc/index.htm) es bueno con los archivos. – chris
Escribir C++ después de que Python tiene ganas de escribir en un lenguaje ensamblador después de C++ :) En lo que respecta al C++ estándar, esta es una tarea sorprendentemente intensiva en cuanto a los códigos. En segundo lugar sugiero utilizar 'boost :: filesystem'. – dasblinkenlight
Impresionante, gracias por la referencia. Voy a verificar eso. – Jim