Я нашел следующее решение, чтобы определить, поддерживает ли диск жесткие ссылки:
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, не требуя записи на этот диск?
Спасибо всем комментаторам. Я собрал ваши предложения и в итоге нашел следующее решение. Это решение должно работать и для 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()
предоставляет всю необходимую информацию.
Других решений пока нет …