2016-04-11 6 views
0

ユーザーのTempディレクトリ%localappdata%/ Temp内のフォルダを削除して残っている空のフォルダを削除しようとしていますが、ユニコードパスを考慮する必要があります。ユーザーのTempディレクトリ内のフォルダを削除しますが、ユニコードフォルダ名も考慮してください

私が使っていた

double delete_tempfolder(const char* directory_name) { 
    rmdir(directory_name); 
    return 1; 
} 

int main(){ 

    delete_tempfolder("C:\\Users\\USER\\AppData\\Local\\Temp\\TMPDIR"); 
    cin.get(); 
    return 0; 

} 

しかし、すぐにディレクトリが非ASCII文字を使用して、rmdirをは動作を停止し、私はそれが可能な通常、そのパス内のユーザー名のフォルダなどのUnicode文字で作業する必要がありますそれらを持っています。

+0

どのコンパイラを使用していますか? 'char'配列はワイド文字列を保持できません。 Visual Studioでは、[_wrmdir](https://msdn.microsoft.com/en-us/library/wt8es881.aspx)を使用できます。 –

+0

MinGW g ++を-static-libgccで使用しています。-static-libstdC++ -D UNICODE -D _UNICODE -O3 -DNDEBUG -s -o "_Test.exe" – user780756

+2

MinGWはまだ '_wrmdir()'にアクセスする必要があります。そうでない場合は、MinGW-w64を使用してください。文字列リテラルの前に 'L '(したがって' L "C:\\ whatever.txt" ')を付け、' char * 'の代わりに' wchar_t * 'を使用してください。 – andlabs

答えて

-2

MultiByteToWideChar()についてもう少しお読みください。これは私にとっては役に立ちました。非ASCII名のディレクトリも削除できました。

double fn_directory_remove(const char* lpath) { 

    int wchars_num = MultiByteToWideChar(CP_UTF8 , 0 , lpath, -1, NULL, 0); 

    WCHAR* wstr = new WCHAR[wchars_num]; 

    MultiByteToWideChar(CP_UTF8, 0, lpath, -1, wstr, wchars_num); 

    // print directory to delete 
    std::wcout << wstr; 

    if (RemoveDirectoryW(wstr)) { 
     delete[] wstr; 
     return 1; 
    } else { 
     delete[] wstr; 
     return 0; 
    } 

} 


// note: should use GetTempPathW() to get actual user Temp directory 
double _out = fn_directory_remove("C:\\Users\\USER\\AppData\\Local\\Temp\\TEMPDIR"); 
cout << "Deleted directory (%localappdata%\\Temp\\TEMPDIR\\): " << _out << endl; 
+0

WindowsはUTF-8でエンコードされたパスをサポートしていません。 'CP_UTF8'の代わりに' CP_ACP'を使います。あるいは、 'char *'を使わずに 'wchar_t *'を使うと 'MultiByteToWideChar()'を使う必要はありません。 –

+0

大規模な過密化。 ANSIの使用をやめて、ネイティブのエンコーディングUTF-16を使用してください。 –

+0

DLLで関数を呼び出す必要があるはずです。 LPCSTRとしてLPCSTR(LPCSTRまたはdoubleをサポートするフレームワークのため)だけを渡すことができるので、MultiByteToWideChar()を使用する必要がありますか? – user780756

関連する問題