2013-06-01 4 views
3

Я работаю под 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; 
} 
+0

Хотя непосредственно не связанные с вашим вопросом, http://utf8everywhere.org имеет обширную дискуссию о том, делать что-то правильно в Windows. –

ответ

2

Если я правильно понял вопрос правильно, вопрос о невозможности создания файла непосредственно в C:\UnicodeTest\вячеслав происходит, когда вы не создаете каталог folder, как показано на рисунке ниже.

// 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"; 

Я был в состоянии получить эту работу, сделав имя файла в wchar_t строку:

// create a path for the file 
boost::filesystem::wpath filePath = path/L"test.txt"; 
+0

Не имеет значения, создаю ли я другую папку или нет - я все еще не могу создать файл. Папка была более или менее доказательством правильности исходного пути. Создание имени файла в строке wchar_t тоже ничего не изменит. – Koonschi

+0

Я использую Visual Studio 2012 на Win7 plus boost 1.52, так что не совсем ваша конфигурация. Однако при использовании 'boost :: filesystem :: wpath filePath = path /" test.txt ";' он игнорировал имя файла и не добавлял его к пути. Но когда я использовал 'L" test.txt ", он добавил имя файла в путь и разрешил создание файла после его написания. –

+0

Если вы не можете заставить это работать, было бы целесообразно задать этот вопрос в новостной группе пользователей новостей: //news.gmane.org: 119/gmane.comp.lib.boost.user –

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