Я работаю под Windows 7 с помощью mingw. Я столкнулся с каким-то странным поведением с именами файлов unicode. Моя программа должна быть переносимой, и я использую boost::filesystem (v 1.53)
для обработки путей к файлам.Открыть файл с пути unicode
Это все шло хорошо, пока мне не нужно было открывать файлы с именами файлов unicode. Речь идет не о содержании файла, а о имени файла.
Я пробовал следующее: для тестирования я создал папку с именем C:\UnicodeTest\вячеслав
, и я попытался создать файл внутри него, добавив имя файла test.txt
в сторону увеличения wpath. По какой-то причине создание файла выходит из строя. Я использую boost fstream
s, и когда я пытаюсь открыть файл, устанавливается битбит потока. Теперь самое смешное, что когда я добавляю имя папки в путь, вызов create_directories()
завершается успешно и создает правильный каталог C:\UnicodeTest\вячеслав\folder
.
Я действительно не понимаю, почему он не будет работать с файлом. Это код, я использую:
boost::filesystem::wpath path;
// find the folder to test
boost::filesystem::wpath dirPath = "C:\\UnicodeTest";
vector<boost::filesystem::wpath> files;
copy(boost::filesystem::directory_iterator(dirPath), boost::filesystem::directory_iterator(), back_inserter(files));
for(boost::filesystem::wpath &file : files)
{
if(boost::filesystem::is_directory(file))
{
path = file;
break;
}
}
// create a path for the folder
boost::filesystem::wpath folderPath = path/"folder";
// this works just fine
boost::filesystem::create_directories(folderPath);
// create a path for the file
boost::filesystem::wpath filePath = path/"test.txt";
boost::filesystem::ofstream stream;
// this fails
stream.open(filePath);
if(!stream)
{
cout << "failed to open file " << path << endl;
}
else
{
cout << "success" << endl;
}
Хотя непосредственно не связанные с вашим вопросом, http://utf8everywhere.org имеет обширную дискуссию о том, делать что-то правильно в Windows. –