我在Windows 7下使用mingw工作。我遇到了一些unicode文件名的怪异行为。我的程序需要可移植,并且我使用boost::filesystem (v 1.53)
来处理文件路径。
这一直都很顺利,直到我需要打开带有unicode文件名的文件。 这不是文件的内容,而是文件的名称。
我尝试了以下操作:为了测试,我创建了一个名为C:\UnicodeTest\вячеслав
的文件夹,我尝试在其中创建一个文件,方法是将文件名test.txt
附加到boost wpath。
由于某种原因,文件的创建失败。我正在使用boost fstream
,当我尝试打开文件时,会设置流的failbit。
现在有趣的是,当我将foldername追加到路径时,对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 :(得分:3)
如果我正确理解了该问题,则在您未创建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";