【问题标题】:HDD or SSD in VC++ [duplicate]VC ++中的HDD或SSD [重复]
【发布时间】:2011-08-09 03:28:46
【问题描述】:

VC++ 中有没有办法判断计算机中安装的驱动器是 HDD 还是 SSD?此外,还可以获取某个人在 HDD 或 SSD 中的位置。

我将不胜感激。谢谢!

【问题讨论】:

  • 您的具体需求是什么?在许多情况下,甚至操作系统都不知道驱动器是 SSD。
  • 考虑到SSD的成本,为什么不问问店主呢?她会知道的。
  • 认为这是不可能的。 SSD 的一个重要特性是它的行为方式与标准硬盘完全相同。任何特定于 SSD 的东西都将由操作系统和低级驱动程序处理,而不是您的应用程序。
  • @Gabe:“在大多数情况下”是问题所在。
  • @CodyGray:可能很安静,准确度很高;看我的回答。甚至可能有一种 100% 准确的方法来做到这一点,尽管我个人并不认识。 (我刚刚遇到this,虽然我没有尝试过,但它可能也可以。)

标签: windows visual-studio-2008 hard-drive


【解决方案1】:

这不是 100% 万无一失,但它是 Linux 使用的方法。
它会检查驱动器的产品 ID 中是否包含“SSD”一词:

#include <tchar.h>
#include <windows.h>
#include <winioctl.h>

void Check(LPCTSTR file, LPCTSTR volPathWithLeadingPrefix)
{
    HANDLE hFile = CreateFile(
        volPathWithLeadingPrefix,
        FILE_READ_ATTRIBUTES,  // Just querying; don't mount
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
        NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL);
    STORAGE_PROPERTY_QUERY spq =
    { StorageDeviceProperty, PropertyStandardQuery };
    union
    {
        STORAGE_DEVICE_DESCRIPTOR StorageDeviceDescriptor;
        BYTE Data[1024];
    } output = {0};
    DWORD br;
    if (DeviceIoControl(
        hFile, IOCTL_STORAGE_QUERY_PROPERTY,
        &spq, sizeof(spq), &output, sizeof(output),
        &br, NULL))
    {
        STORAGE_DEVICE_DESCRIPTOR &sdd =
            output.StorageDeviceDescriptor;
        if (sdd.ProductIdOffset > 0)
        {
            LPCSTR productID = (LPCSTR)&((LPBYTE)&sdd)[sdd.ProductIdOffset];
            BOOL isSSD = strstr(productID, "SSD") != NULL;
            _tprintf(_T("\"%s\": %s\n"), file, isSSD ? _T("SSD") : _T("HDD"));
        }
        else { _ftprintf(stderr, _T("No product ID.")); }
    }
    else
    { _ftprintf(stderr, _T("Error %u querying storage.\n"), GetLastError()); }
}

int _tmain(int argc, TCHAR *argv[])
{
    for (int i = 1; i < argc; i++)
    {
        LPCTSTR file = argv[i];
        TCHAR volPath[MAX_PATH];
        if (GetVolumePathName(file, volPath, ARRAYSIZE(volPath)))
        {
            for (size_t cchVolPath = _tcslen(volPath);
                cchVolPath > 0 && volPath[cchVolPath - 1] == TEXT('\\');
                cchVolPath--)
            { volPath[cchVolPath - 1] = TEXT('\0'); }

            TCHAR volPathWithLeadingPrefix[ARRAYSIZE(volPath)];
            if (_sntprintf(
                volPathWithLeadingPrefix,
                ARRAYSIZE(volPathWithLeadingPrefix),
                volPath[0] == _T('\\') ? _T("%s") : _T("\\\\.\\%s"),
                volPath) < ARRAYSIZE(volPathWithLeadingPrefix))
            {
                Check(file, volPathWithLeadingPrefix);
            }
            else
            {
                SetLastError(ERROR_FILENAME_EXCED_RANGE);
                _ftprintf(stderr, _T("Path \"%s\" is too long.\n"), volPath);
            }
        }
        else
        {
            _ftprintf(
                stderr,
                _T("Error %u getting volume path.\n"),
                GetLastError());
        }
    }
}

【讨论】:

  • 我的 SSD 显示“SAMSUNG MMCRE28G8MXP-0VB”。
  • @Gabe:就像我说的,这不是万无一失的。但它is 是某些程序使用的方法,它确实 有时有效,所以总比没有好。也许this 会更好,我不知道。
猜你喜欢
  • 2016-02-13
  • 2017-10-04
  • 1970-01-01
  • 2015-07-12
  • 2021-10-09
  • 2013-07-14
  • 2023-04-04
  • 1970-01-01
  • 2020-07-02
相关资源
最近更新 更多