What I've done:
struct vpath_traits;
typedef boost::filesystem::basic_path<std::string, vpath_traits> vpath;
struct vpath_traits
{
typedef std::string internal_string_type;
typedef std::wstring external_string_type;
static external_string_type to_external(
const vpath &, const internal_string_type &src);
static internal_string_type to_internal(const external_string_type &src);
};
namespace boost {
namespace filesystem {
template<> struct is_basic_path<vpath>
{ BOOST_STATIC_CONSTANT( bool, value = true ); };
}
}
std::string vpathToWin32Byte(const vpath &src);
vpath vpathFromWin32Byte(const std::string &str);
vpath vpathFromWin32Byte(const char *str);
std::wstring vpathToWin32Wide(const vpath &src);
vpath vpathFromWin32Wide(const std::wstring &str);
vpath vpathFromWin32Wide(const wchar_t *str);
QDir vpathToQDir(const vpath &src);
vpath vpathFromQDir(const QDir &qdir);
Note:
You must somehow implement the vpath_traits::to_externaland
methods vpath_traits::to_internal. There is probably some utf8 converter to increase. However, I applied utf8 to ucs-16 and came back myself, but it's neither pretty nor complete, so you better use some standard implementations.
It works in our code. E g:
namespace fs = boost::filesystem;
...
vpath dstFile = dstDir / filePath;
bool success = true;
try { fs::remove(dstFile); }
catch (fs::basic_filesystem_error<vpath> & ) { success = false;}
if (success) {
try { fs::copy_file(srcFile, dstFile); }
catch (fs::basic_filesystem_error<vpath> & ) { success = false;}
}
...
source
share