// Boost.Filesystem mbcopy.cpp ---------------------------------------------// // Copyright Beman Dawes 2005 // Use, modification, and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // Copy the files in a directory, using mbpath to represent the new file names // See http://../doc/path.htm#mbpath for more information // See deprecated_test for tests of deprecated features #define BOOST_FILESYSTEM_NO_DEPRECATED #include #ifdef BOOST_FILESYSTEM_NARROW_ONLY #error This compiler or standard library does not support wide-character strings or paths #endif #include "mbpath.hpp" #include #include #include #include "../src/utf8_codecvt_facet.hpp" namespace fs = boost::filesystem; namespace { // we can't use boost::filesystem::copy_file() because the argument types // differ, so provide a not-very-smart replacement. void copy_file(const fs::wpath& from, const user::mbpath& to) { fs::ifstream from_file(from, std::ios_base::in | std::ios_base::binary); if (!from_file) { std::cout << "input open failed\n"; return; } fs::ofstream to_file(to, std::ios_base::out | std::ios_base::binary); if (!to_file) { std::cout << "output open failed\n"; return; } char c; while (from_file.get(c)) { to_file.put(c); if (to_file.fail()) { std::cout << "write error\n"; return; } } if (!from_file.eof()) { std::cout << "read error\n"; } } } // namespace int main(int argc, char* argv[]) { if (argc != 2) { std::cout << "Copy files in the current directory to a target directory\n" << "Usage: mbcopy \n"; return 1; } // For encoding, use Boost UTF-8 codecvt std::locale global_loc = std::locale(); std::locale loc(global_loc, new fs::detail::utf8_codecvt_facet); user::mbpath_traits::imbue(loc); std::string target_string(argv[1]); user::mbpath target_dir(user::mbpath_traits::to_internal(target_string)); if (!fs::is_directory(target_dir)) { std::cout << "Error: " << argv[1] << " is not a directory\n"; return 1; } for (fs::wdirectory_iterator it(L"."); it != fs::wdirectory_iterator(); ++it) { if (fs::is_regular_file(it->status())) { copy_file(*it, target_dir / it->path().filename()); } } return 0; }