J'écris un programme en C++ qui va traiter un grand nombre (en milliers) d'images PPM toutes stockées dans le même répertoire. Cependant, j'ai d'abord besoin de lire dans les valeurs de pixels. Est-ce leur fonction intégrée dans l'espace de noms standard ou une bibliothèque que je pourrais importer qui me permettrait de lire tous les fichiers un à la fois sans supposer que je connais déjà le nom du fichier en utilisant une sorte de structure en boucle? Dans le cas où cela fait une différence, j'écris le programme sur un Mac.Comment lire dans un répertoire de fichiers
Répondre
Afin d'éviter d'inclure boost::filesystem
et les dépendances nécessaires, je fini par mettre en œuvre cette fonction:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stdexcept>
//include headers required for directory traversal
#if defined(_WIN32)
//disable useless stuff before adding windows.h
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#else
#include "dirent.h"
#endif
/**
Traverses the provided directory (non-recursively) and extracts the absolute paths to all the files in it.
Doesn't support non-ASCII file names.
@param directory the absolute path to the directory
@return a vector of file names (including extension)
*/
std::vector<std::string> Filesystem::GetFilesInDirectory(const std::string &directory)
{
std::vector<std::string> output;
#if defined(_WIN32)
//select all files
std::string tempDirectory = directory + "*";
//initialize the WIN32_FIND_DATA structure
WIN32_FIND_DATA directoryHandle = {0};
//set the directory
std::wstring wideString = std::wstring(tempDirectory.begin(), tempDirectory.end());
LPCWSTR directoryPath = wideString.c_str();
//iterate over all files
HANDLE handle = FindFirstFile(directoryPath, &directoryHandle);
while(INVALID_HANDLE_VALUE != handle)
{
//skip non-files
if (!(directoryHandle.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
//convert from WCHAR to std::string
size_t size = wcslen(directoryHandle.cFileName);
std::vector<char> buffer;
buffer.resize(2 * size + 2);
size_t convertedCharacters = 0;
wcstombs_s(&convertedCharacters, buffer.data(), 2 * size + 2, directoryHandle.cFileName, _TRUNCATE);
//trim the null characters (ASCII characters won't fill the vector, since they require fewer bytes)
//convertedCharacters includes the null character, which we want to discard
std::string file(buffer.begin(), buffer.begin() + convertedCharacters - 1);
//add the absolute file path
output.emplace_back(file);
}
if(false == FindNextFile(handle, &directoryHandle)) break;
}
//close the handle
FindClose(handle);
#else
DIR *directoryHandle = opendir(directory.c_str());
if (NULL != directoryHandle)
{
dirent *entry = readdir(directoryHandle);
while (NULL != entry)
{
//skip directories and select only files (hopefully)
//if ((DT_DIR != entry->d_type) && (DT_UNKNOWN == entry->d_type))
if (DT_REG == entry->d_type)
{
output.emplace_back(entry->d_name);
}
//go to next entry
entry = readdir(directoryHandle);
}
closedir(directoryHandle);
}
#endif
return output;
}
Je ne suis pas très fier de ce qui précède unflexible/la plupart du temps le code inutile/dépendant de la plateforme et je certainement optez pour BOOST si possible. En passant, il n'est pas testé sur un MAC, alors s'il vous plaît faites le moi savoir si cela fait l'affaire.
Eh bien, j'ai juste copié et collé votre code et avec un ajustement mineur, je l'ai fait fonctionner! Je vous remercie d'avoir posté votre code, c'était très utile. Merci! – lxdr
De rien! :) –
- 1. comment lire certains fichiers dans un répertoire dans Excel VBA
- 2. Comment lire/écrire des fichiers dans un répertoire utilisateur inconnu?
- 3. php: comment lire uniquement les fichiers txt dans un répertoire
- 4. lire manuellement un fichier dans le répertoire des fichiers
- 5. En utilisant MapReduce pour lire les fichiers dans un répertoire
- 6. Lire des fichiers dans un répertoire et les ouvrir/fermer
- 7. Ant lire des fichiers dans un répertoire et regex
- 8. Comment lire un nom de répertoire dans un script bash
- 9. MATLAB - lire les fichiers du répertoire?
- 10. Comment puis-je lire les fichiers dans un répertoire dans l'ordre de tri?
- 11. récursivement lire un répertoire dans NodeJS
- 12. Comment parcourir les fichiers dans un répertoire?
- 13. comment lister les fichiers dans un répertoire?
- 14. comment accéder aux fichiers dans un répertoire
- 15. OS X/Cocoa - comment lire tous les fichiers d'un répertoire?
- 16. Comment lire et écrire à partir de plusieurs fichiers dans un seul répertoire? Python
- 17. Comment lire tous les noms de fichiers d'un répertoire dans un tableau?
- 18. comment puis-je lire les noms de fichiers dans le répertoire à un tableau
- 19. Lire tous les fichiers dans le répertoire sauf
- 20. perl - comment lire plusieurs fichiers dans un répertoire et stocker des données dans une variable unique
- 21. Comment lire les fichiers du répertoire par leur nom?
- 22. Comment lire tous les fichiers d'un répertoire et déplacer des fichiers vers un autre répertoire en cours a ouvert 4gl?
- 23. comment ouvrir le répertoire et lire les fichiers dans ce répertoire en utilisant perl
- 24. Plusieurs fichiers dans un répertoire?
- 25. comment lire un fichier dans un autre répertoire en python
- 26. Comment lister récursivement tous les fichiers dans un répertoire en C# et copier tous les fichiers dans un autre répertoire
- 27. Lire les fichiers dans le répertoire sur ruby on rails
- 28. comment puis-je lire un fichier spécifique d'un répertoire? - abap
- 29. Impossible de lire les fichiers d'un répertoire - android
- 30. copier un répertoire de fichiers dans le répertoire courant
La bibliothèque standard n'a aucune notion de "système de fichiers" pour le moment. Vous devrez utiliser une solution spécifique à la plate-forme (ou Boost.Filesystem). –
Voir pertinent: http://stackoverflow.com/questions/7377596/directory-recursion/7377707#7377707 – sehe