指定されたディレクトリ (ログイン資格情報を含むローカルまたは共有パス) に書き込み権限があるかどうかを知る必要があります。
GetFileAttributes を使用していますが、常に FILE_ATTRIBUTE_DIRECTORY のみを返します。
私のコードは以下のようなものです
if(storageLocation != "")
{
//! check if local storage - user name password would be empty
if(storageUsername == "" && storagePassword == "")
{
//! local storage
//! lets check whether the local path is a valid path or not
boost::filesystem::path fpath(storageUsername.c_str());
if(boost::filesystem::exists(fpath))
{
DWORD attrib = ::GetFileAttributes(storageLocation.c_str());
if((attrib != INVALID_FILE_ATTRIBUTES) &&
((attrib & FILE_ATTRIBUTE_READONLY) != FILE_ATTRIBUTE_READONLY))
{
string strWritePermission = "TRUE";
}
}
}
else
{
uncLocation_t uncLocation;
uncLocation.m_location = storageLocation;
uncLocation.m_username = storageUsername;
uncLocation.m_password = storagePassword;
if(0 == connectToUNCLocation(uncLocation)) // My function to connect to UNC location
{
//! successful connection
DWORD attrib = ::GetFileAttributes(storageLocation.c_str());
if((attrib != INVALID_FILE_ATTRIBUTES) &&
((attrib & FILE_ATTRIBUTE_READONLY) != FILE_ATTRIBUTE_READONLY))
{
string strWritePermission = "TRUE";
}
}
}
}
理由はわかりませんが、GetFileAttributes は常に 0x16 を返します。
共有フォルダーを作成し、その中に2つのフォルダーを作成してテストしました。1 つは読み取り専用のアクセス許可で、もう 1 つはデフォルトのアクセス許可です。ただし、3 つのケース (共有フォルダー、読み取り専用フォルダー、および既定のアクセス許可フォルダー) のすべてで、同じ戻り値が得られます。
書き込み許可を見つけて、一時ファイルを作成し (GENERIC_WRITE モードで inf CreateFile を使用)、正常に作成された場合は削除する方法があります。ただし、ユーザーが場所を指定するたびにアプリケーションで一時ファイルを作成したくないため、この方法は使用したくありません。
何をすべきか提案してください。