查看文件路径是映射/远程还是本地

Find out if file path is mapped / remote or local

是否可以确定驱动器路径(例如 P:/temp/foo)是本地的还是远程的?

此处 ( CMD line to tell if a file/path is local or remote? ) 显示了 cmd 评估,但我正在寻找 C++/Qt 方式。

相关:

  1. QDir::exists with mapped remote directory
  2. How to perform Cross-Platform Asynchronous File I/O in C++

您可以使用 GetDriveType 函数:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx

Qt 中没有办法,至少到 Qt 5.5。 QStorageInfo would be the closest fit, but there is no agreement about how such an API should look like (see the gigantic discussion that started in this thread; Qt 报告误导性信息基本上是一种风险)。

所以,现在您可以使用本机 API。前面提到的 GetDriveType 适用于 Windows,但在 Linux 和 Mac 上你几乎只能靠自己了。

我最近提交了关于这个确切问题的功能请求:https://bugreports.qt.io/browse/QTBUG-83321

那里出现了一个可能的解决方法。使用以下枚举:

enum DeviceType {
    Physical,
    Other,
    Unknown
};

我可以在 Linux、Windows 和 macOS 上使用以下函数可靠地检查挂载是本地设备还是其他东西(可能是网络挂载):

DeviceType deviceType(const QStorageInfo &volume) const
{
#ifdef Q_OS_LINUX
    if (QString::fromLatin1(volume.device()).startsWith(QLatin1String("/"))) {
        return DeviceType::Physical;
    } else {
        return DeviceType::Other;
    }
#endif
#ifdef Q_OS_WIN
    if (QString::fromLatin1(volume.device()).startsWith(QLatin1String("\\?\Volume"))) {
        return DeviceType::Physical;
    } else {
        return DeviceType::Other;
    }
#endif
#ifdef Q_OS_MACOS
    if (! QString::fromLatin1(volume.device()).startsWith(QLatin1String("//"))) {
        return DeviceType::Physical;
    } else {
        return DeviceType::Other;
    }
#endif
    return DeviceType::Unknown;
}