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

Есть ли выражение/строка, которая, скажем, вернется, пока вы не найдете «Журналы» и не откроете ее? (Предполагается, что вы всегда были под ним)Структура каталогов C++

же исполняемый файл запускается из «Debug», «MNH» или «FF» в разное время, исполняемый файл всегда должен сохранить это лог-файлы в «Журналы».

Какое выражение будет получено без ссылки на весь путь C: \ Projects \ Logs?

Спасибо.

ответ

2

Похоже, вы спрашиваете об относительном пути.

Если рабочий каталог C:\Projects\Logs\RTC\MNH\Debug\, путь ..\..\..\file представляет файл в каталоге Logs.

Если вы, возможно, находитесь в C:\Projects\Logs\RTC\MNH\ или C:\Projects\Logs\RTC\MNH\Debug\, то ни одно выражение не вернет вас обратно Logs с любого места. Вы можете попробовать проверить наличие ..\..\..\..\Logs, и если этого не произошло, попробуйте ..\..\..\Logs, ..\..\Logs и ..\Logs, который будет существовать, и расскажет вам, как вы «глубоки», и сколько .. s требуется, чтобы вернуть вас к Logs.

3

Возможно, вам повезло с использованием библиотеки boost::filesystem.

без компилятора (и ниндзя-копия из повышающей документации), что-то вроде:

#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 
    } 
} 

Сейчас это совершенно непроверенные :)

Смежные вопросы