Узнайте, отображается ли путь к файлу / удаленный или локальный

Можно ли узнать, является ли путь к диску (например, P:/temp/foo) локальным или удаленным?

Здесь (строка CMD, чтобы узнать, файл/путь является локальным или удаленным?) он показан для оценки cmd, но я ищу способ C++/Qt.

Относится к:

  1. QDir::exists с сопоставленным удаленным каталогом
  2. Как выполнить кросс-платформенный асинхронный файловый ввод-вывод в С++

person Horst Walter    schedule 09.02.2015    source источник
comment
Это специфичный для Windows вопрос? Если это так, пометьте его с помощью winapi, в Qt нет способа сделать это.   -  person sashoalm    schedule 10.02.2015
comment
Я не был уверен, есть ли способ Qt сделать это. Поэтому я оставил его открытым, однако независимый от платформы способ, конечно, предпочтительнее. На самом деле Пепе указал на интересный способ, который я проверю, но мне нужно перейти на Qt 5.4 раньше. Оба ответа полезны! Спасибо.   -  person Horst Walter    schedule 10.02.2015


Ответы (3)


В Qt нет возможности, по крайней мере, до Qt 5.5. Наиболее подходящим будет QStorageInfo, но нет единого мнения о том, как такой API должно выглядеть так (см. гигантское обсуждение, которое началось в этой теме; в основном есть риск, что Qt сообщит вводящую в заблуждение информацию).

Итак, на данный момент вы можете использовать нативные API. Вышеупомянутый GetDriveType подойдет для Windows, но в Linux и Mac вы будете предоставлены сами себе.

person peppe    schedule 09.02.2015

вы можете использовать функцию GetDriveType:

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

person iedoc    schedule 09.02.2015
comment
Он говорит, что ищет кросс-платформенный способ, а не специфичный для Windows. - person sashoalm; 09.02.2015
comment
он не сказал ни того, ни сейчас, когда вы упомянули об этом - person iedoc; 09.02.2015
comment
Он не говорит прямо, но он помечен Qt, а не winapi, и не упоминает Windows... Я имею в виду, что он может нацеливаться на Linux, поскольку мы знаем. Хорошо, я перечитал его вопрос, и он сказал P:/, так что я думаю, что это все-таки Windows. Но ОП не очень ясно. - person sashoalm; 10.02.2015
comment
В любом случае, полезный совет, я буду использовать его как запасной вариант, когда не смогу найти решение Qt. - person Horst Walter; 10.02.2015

Недавно я отправил запрос функции именно по этому вопросу: 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;
}
person Tobias Leupold    schedule 08.04.2020