2009-09-17 12 views
0
C:\Projects\Logs\RTC\MNH\Debug 
C:\Projects\Logs\FF 

Existe-t-il une expression/chaîne qui indiquerait de revenir en arrière jusqu'à ce que vous trouviez "Logs" et l'ouvriez? (En supposant que vous étiez toujours en dessous)structures de répertoires C++

Le même exécutable est exécuté sur « Debug », « MNH » ou « FF » à des moments différents, l'exécutable doit toujours enregistrer est les fichiers journaux dans « journaux ».

Quelle expression obtiendrait-elle SANS se référant au chemin entier C: \ Projects \ Logs?

Merci.

Répondre

2

Il semble que vous demandiez un chemin relatif.

Si le répertoire de travail est C:\Projects\Logs\RTC\MNH\Debug\, le chemin ..\..\..\file représente un fichier dans le répertoire Logs.

Si vous êtes dans C:\Projects\Logs\RTC\MNH\ ou C:\Projects\Logs\RTC\MNH\Debug\, aucune expression ne vous ramènera à Logs de l'une ou l'autre place. Vous pouvez essayer de vérifier l'existence de ..\..\..\..\Logs et si cela n'existe pas, essayez ..\..\..\Logs, ..\..\Logs et ..\Logs, dont un existe vous dirait à quel point vous êtes "profond" et combien de .. sont nécessaires pour vous ramener à Logs.

3

Vous pourriez avoir de la chance en utilisant la bibliothèque boost::filesystem.

Sans un compilateur (et ninja-copies de la documentation boost), quelque chose comme:

#include <boost/filesystem.hpp> 

namespace boost::filesystem = fs; 

bool contains_folder(const fs::path& path, const std::string& folder) 
{ 
    // replace with recursive iterator to check within 
    // sub-folders. in your case you just want to continue 
    // down parents paths, though 
    typedef fs::directory_iterator dir_iter; 

    dir_iter end_iter; // default construction yields past-the-end 
    for (dir_iter iter(path); iter != end_iter; ++iter) 
    { 
     if (fs::is_directory(iter->status())) 
     { 
      if (iter->path().filename() == folder) 
      { 
       return true; 
      } 
     } 
    } 

    return false; 
} 

fs::path find_folder(const fs::path& path, const std::string& folder) 
{ 
    if (contains_folder(path, folder)) 
    { 
     return path.string() + folder; 
    } 

    fs::path searchPath = path.parent_path(); 
    while (!searchPath.empty()) 
    { 
     if (contains_folder(searchPath, folder)) 
     { 
      return searchPath.string() + folder; 
     } 

     searchPath = searchPath.parent_path(); 
    } 

    return "": 
} 

int main(void) 
{ 
    fs::path logPath = find_folder(fs::initial_path(), "Log"); 

    if (logPath.empty()) 
    { 
     // not found 
    } 
} 

Pour l'instant ce qui est totalement non testé :)

Questions connexes