2015-10-27 3 views
2

У меня есть такой путь, как это:как получить путь с задней PathSeparator в C++ с использованием подталкивания

boost::filesystem::path mypath("c:/test"); 
boost::filesystem::path mypath1("c:/test/); 

Я хочу, чтобы убедиться, что, когда я конвертировать их в строки, оба из них выглядит как:

c:/test/ 

, например, если я:

cout<<mypath.string()<<endl; 
cout<<mypath1.string()<<endl; 

оба распечатайте:

c:/test/ 

Как это сделать в C++ с использованием boost?

+0

Я не думаю, любой из стандартных функций библиотеки файловой системы поддерживает то, что вы после , он всегда будет протачивать 'C:/test' как файл и' C:/test/'как каталог - пока вы не проверите его. Лучше всего было бы преобразовать в строку и проверить, заканчивается ли она разделителем путей и если нет, добавьте t o строка! – Nim

ответ

0

Не думаю, что есть встроенная функция.

Вы могли бы использовать это, хотя:

if ("." != p.filename()) 
    p += fs::path::preferred_separator; 

Это не добавит разделитель, если путь заканчивается в /.

Необязательно, вызовите p.remove_trailing_separator первый, но это также приведет к удалению если он был частью ввода (некоторые приложения рассматривают это как имеющее значительный смысл).

Live On Coliru

#include <boost/filesystem.hpp> 
#include <boost/range/iterator_range.hpp> 
#include <iostream> 

namespace fs = boost::filesystem; 

int main(int argc, char** argv) { 
    for (std::string s : boost::make_iterator_range(argv+1, argv+argc)) { 
     fs::path p = s; 
     //p.remove_trailing_separator(); 
     if ("." != p.filename()) 
      p += fs::path::preferred_separator; 

     std::cout << "'" << s << "'\t" << p << "\n"; 
    } 
} 

печать (на Linux, очевидно):

'.' "." 
'' "/" 
'/' "//" 
'/tmp' "/tmp/" 
'/tmp/' "/tmp/" 
'/tmp//' "/tmp//" 
'/tmp/.' "/tmp/." 
'/tmp/..' "/tmp/../" 
'/tmp/...' "/tmp/.../" 
'/tmp/aa.txt' "/tmp/aa.txt/" 
'c:\test.txt' "c:\test.txt/"