5

私はmingwを使用してWindows 7で作業しています。Unicode ファイル名で奇妙な動作に遭遇しました。私のプログラムは移植可能である必要がありboost::filesystem (v 1.53)、ファイルパスを処理するために使用しています。

ユニコードファイル名のファイルを開く必要があるまで、これはすべてうまくいっています。これはファイルの内容ではなく、ファイルの名前です。

私は次のことを試しました: テストのために、という名前のフォルダーC:\UnicodeTest\вячеславを作成し、ファイル名test.txtをブースト wpath に追加して、その中にファイルを作成しようとしました。何らかの理由でファイルの作成に失敗します。ブーストのfstreams を使用していますが、ファイルを開こうとすると、ストリームのフェイルビットが設定されます。面白いことに、代わりにフォルダー名をパスに追加すると、への呼び出しが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;
}
4

1 に答える 1

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";
于 2013-06-01T17:35:47.140 に答える