1

ドライブがハード リンクをサポートしているかどうかを判断するには、次の解決策を見つけました。

CString strDrive = _T("C:\\");
DWORD dwSysFlags;
if(GetVolumeInformation(strDrive, NULL, 0, NULL, NULL, &dwSysFlags, NULL, 0))
{
    if((dwSysFlags & FILE_SUPPORTS_HARD_LINKS) != 0)
    {
        // Hard links can be created on the specified drive.
    }
    else
    {
        // Hard links cannot be created on the specified drive.
    }
}

ただし、MSDNによると、このフラグFILE_SUPPORTS_HARD_LINKSは Windows Server 2008 R2 および Windows 7 までサポートされていません。

CreateHardLink()ダミーのハードリンクを作成するために使用することも考えました。ハード リンクが作成されている場合、対応するドライブにハード リンクを作成できることがわかります。ただし、上記のドライブへのアクセス権がない場合があります。この場合、この方法は失敗すると思います。

そのドライブへの書き込みアクセスを必要とせずに、ドライブが Windows XP でハード リンクをサポートしているかどうかを判断する方法を知っている人はいますか?

4

1 に答える 1

3

すべてのコメンテーターに感謝します。あなたの提案をまとめて、次の解決策に至りました。このソリューションは Vista でも機能するはずです。

CString strDrive = _T("C:\\");
DWORD dwSysFlags;

TCHAR szFileSysName[1024];
ZeroMemory(szFileSysName, 1024);

if(GetVolumeInformation(strDrive, NULL, 0, NULL, NULL, &dwSysFlags, szFileSysName, 1024))
{
    // The following check can be realized using GetVersionEx().
    if(bIsWin7OrHigher())
    {
        if((dwSysFlags & FILE_SUPPORTS_HARD_LINKS) != 0)
        {
            // Hard links can be created on the specified drive.
        }
        else
        {
            // Hard links cannot be created on the specified drive.
        }
    }
    else
    {
        if(_tcsicmp(szFileSysName, _T("NTFS")) == 0)
        {
            // Hard links can be created on the specified drive.
        }
        else
        {
            // Hard links cannot be created on the specified drive (maybe).
        }
    }
}

このソリューションの優れた点 GetVolumeInformation()は、必要なすべての情報が提供されることです。

于 2014-04-09T15:50:25.107 に答える