2013-08-09 3 views
1

EDIT: Я использую зЬй :: TR2 :: SYS не форсировать filesytem-хфайловая система directory_iterator не возвращает полный путь к файлу

Я работаю на простое приложение, которое сканирует каталоги на компьютере и возвращает статистику о тех файлах , Существует два способа сканирования: рекурсивно и нерекурсивно. Путь передается в метод сканирования вместе с флагом для того, нужно ли сканирование выполнять рекурсивно. Учитывая path folder двух реализаций выглядеть примерно так:

directory_iterator start(folder), end; 
for(; start != end; ++start) { 
    //Some code in here 
    // get the path like this: 
    auto path = start->path(); 
} 

или

recursive_directory_iterator start(folder), end; 
for(; start != end; ++start) { 
    //Some code in here 
    // get the path like this: 
    auto path = start->path(); 
} 

Проблема Я сталкиваюсь, что в блоке, который использует регулярные directory_iterator, когда я пытаюсь и захватить путь его будет возвращать только имя файла, т. е. «myTextFile.txt», где при получении его из recursive_directory_iterator возвращается полный путь к файлу в системе. В каждом случае значение папки одинаково (полный путь к файлу). Есть ли причина, что передняя часть пути отрубается или есть какой-то способ получить полный путь к файлу только из сокращенного, который я возвращаю из directory_iterator?

ответ

1

Используйте complete функцию:

auto full_path = std::tr2::sys::complete(path, folder); 

Другой простой способ сделать это было бы быть просто добавить имя файла в пути (протестировано на MSVC2012 с <filesystem> в std::tr2::sys пространстве имен):

for (; start != end; ++start) { 
    auto path = start->path(); 
    auto full_path = folder/path; 
} 
+0

Спасибо, что работает отлично. –

+0

@JesseCarter: Интересно, что 'boost :: filesystem' дает вам полный путь с помощью' start-> path(); ', но реализация Microsoft не делает этого. –

2

Для полного пути вам нужно использовать start->path().directory_string()

directory_iterator end; 
for (directory_iterator start(p); 
     start != end; 
     ++start) 
{ 
    if (is_directory(start->status())) 
    { 
     //A directory 
    } 
    if (is_regular_file(start->status())) 
    { 
     std::cout << start->path().directory_string()<< "\n"; 
    } 
} 

Поиграйте следующие зависимости от ваших потребностей, см подталкивания документов для получения более подробной информации, однако имена их предложить все.

start->path().branch_path(); 
start->path().directory_string(); 
start->path().file_string(); 
start->path().root_path(); 
start->path().parent_path(); 
start->path().string(); 
start->path().basename(); 
start->path().filename(); 
start->path().root_name(); 
start->path().relative_path(); 
+0

Это не работает, я попытался использовать directory_string, и он все еще просто возвращает имя файла без какого-либо пути перед ним. –

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