2011-03-04 4 views
0

Je veux analyser un dossier racine qui est entré par l'utilisateur en utilisant le multi-threading et le multi-traitement à différentes versions. Mais comment puis-je distinguer quand j'analyse un dossier racine si le suivant est un dossier ou un fichier? Pour résumer je veux apprendre comment je peux distinguer le prochain est un dossier ou un dossier. Je veux apprendre ceci parce que si c'est un dossier alors je laisse ouvrir ce dossier à dynamiquement enfiler et/ou traiter. Si c'est un dossier le thread ou processus existant peut continuer son travail sans aucune nécessité de créer un fil différent et/ou processus.J'espère que je peux exprimer mon problème.J'attends vos réponses.Merci.Tout en analysant dans un dossier racine comment puis-je distinguer la prochaine est de savoir si un fichier ou un dossier en langage C?

Répondre

0

Vous pouvez vérifier si un chemin fait référence à un fichier ou un répertoire à l'aide du stat() function, et vérifier le champ st_mode sur la structure retournée (voir http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/stat.h.html).

Sur Windows, vous pouvez utiliser GetFileAttributesEx pour obtenir les attributs de fichier, que vous pouvez vérifier pour voir s'il s'agit d'un fichier ou d'un répertoire. Notez que tout ce que vous utilisez peut être soumis à une condition de concurrence si le système de fichiers est mis à jour par un autre thread ou processus en même temps, car le fichier/répertoire peut être supprimé et/ou changé après l'avoir vérifié et avant d'y accéder.

0

Voici quelques exemples rapides. Ce sera à vous de filer à partir de plusieurs emplacements racine, appelez-les récursivement, et synchroniser toutes les données.

Sous systèmes * nix;

struct dirent *entry; 
while ((entry = readdir("/root")) != NULL) 
{ 
    if (entry->d_type == DT_DIR) 
    { 
     // do something 
    } 
} 
closedir(dir); 

Sous Windows:

WIN32_FIND_DATA findData; 
HANDLE hFind = FindFirstFile(("C:\\root" + "*.*").c_str(), &findData); 
do 
{ 
    if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
    { 
     // do something 
    } 

} while (FindNextFile(hFind, &findData)); 

FindClose(hFind); 
Questions connexes