私はmingwを使用してWindows 7で作業しています。Unicode ファイル名で奇妙な動作に遭遇しました。私のプログラムは移植可能である必要がありboost::filesystem (v 1.53)
、ファイルパスを処理するために使用しています。
ユニコードファイル名のファイルを開く必要があるまで、これはすべてうまくいっています。これはファイルの内容ではなく、ファイルの名前です。
私は次のことを試しました: テストのために、という名前のフォルダーC:\UnicodeTest\вячеслав
を作成し、ファイル名test.txt
をブースト wpath に追加して、その中にファイルを作成しようとしました。何らかの理由でファイルの作成に失敗します。ブーストのfstream
s を使用していますが、ファイルを開こうとすると、ストリームのフェイルビットが設定されます。面白いことに、代わりにフォルダー名をパスに追加すると、への呼び出しがcreate_directories()
成功し、正しい directory が作成されます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;
}