WinAPI вызывает доступ к USB-накопителю, у которого нет буквы диска?

Я заметил, что некоторые USB-устройства хранения данных не регистрируются в Windows как обычные диски, поскольку им даже не назначается буква диска. Таким образом, я не могу получить к ним доступ, используя стандартные файловые операции C API.

Какие вызовы WinAPI я могу использовать для выполнения некоторых обычных файловых операций на этих странных устройствах - так:

  • найти / перечислить эти устройства вообще,
  • просмотрите дерево файлов / каталогов на устройстве и получите некоторую статистику файлов (размер, дату модификации и т. д.),
  • читать / писать содержимое файлов,
  • создавать / удалять файлы / каталоги?

Кроме того, каковы общие ключевые слова, по которым эти типы устройств / протоколов известны / называются?


person akavel    schedule 30.04.2013    source источник
comment
Я предполагаю, что это какой-то медиаплеер? Иногда эти устройства представляют свое хранилище через расширение пространства имен оболочки. Вы можете использовать IShellFolder и друзей для доступа к ним.   -  person Luke    schedule 30.04.2013
comment
У меня с тобой такие же проблемы, и было ли у тебя какое-нибудь решение?   -  person user2990252    schedule 07.06.2018
comment
@ user2990252 Взгляните на ответы ниже, у них есть ссылки на MSDN с подробной информацией об API, которые могут быть актуальны.   -  person akavel    schedule 07.06.2018


Ответы (3)


Если вы говорите о мобильных устройствах, которые выглядят как подключенные тома, но без каких-либо точек подключения, то они называются Windows Portable Devices и они не являются подключенными томами.

Windows не обращается к файловой системе напрямую, она взаимодействует с ними только через протокол передачи мультимедиа (MTP) или Протокол передачи изображений (PTP) и создает пространство имен оболочки extension, чтобы представить пользователю виртуальную папку.

Если вы хотите взаимодействовать с такими устройствами, то, скорее всего, вы захотите использовать WPD API.

person zakinster    schedule 30.04.2013
comment
Ссылка на WPD API пока выглядит как что-то полезное, спасибо! Вы случайно не использовали этот API? - person akavel; 02.05.2013
comment
@akavel Я думаю, что у меня есть код, который где-то валяется, я постараюсь сделать из него небольшой пример, если это возможно. - person zakinster; 02.05.2013

Если вы говорите о запоминающем устройстве USB без присвоенной ему буквы, то это просто том без точки монтирования. Перед чтением / записью тома необходимо смонтировать.

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

Вот быстро написанный пример на языке C, в котором перечислены все существующие тома, смонтированы несмонтированные и показана некоторая информация о каждом томе:

char volumeID[256], volumePathName[256], volumeName[256], volumeFS[256];
char newMountPoint[4] = " :\\";
unsigned long volumeSerialNumber;
unsigned long size;
HANDLE handle = FindFirstVolume(volumeID, 256);
do {
    printf("Volume GUID = %s\n", volumeID);
    GetVolumePathNamesForVolumeName(volumeID, volumePathName, 256, &size);
    if(strlen(volumePathName) == 0) {
        printf("Not mounted\n");
        newMountPoint[0] = firstFreeLetter();
        if(SetVolumeMountPoint(newMountPoint, volumeID)) {
            GetVolumePathNamesForVolumeName(volumeID, volumePathName, 256, &size);
            printf("Now mounted on %s\n", volumePathName);
        }
    }
    else {
        printf("Mounted on %s\n", volumePathName);
    }
    GetVolumeInformation(volumePathName, volumeName, 256, &volumeSerialNumber,
                         NULL, NULL, volumeFS, 256);
    printf("Volume name = %s, FS = %s, serial = %lu\n\n",
           volumeName, volumeFS, volumeSerialNumber);

}while(FindNextVolume(handle, volumeID, 256));

FindVolumeClose(handle);

Я намеренно упрощаю этот пример, но у тома может быть несколько точек монтирования (volumePathName на самом деле многострочный). Он использует эту функцию, чтобы получить первую доступную букву (после 'C') для монтирования диска:

char firstFreeLetter() {
    unsigned long freeLetters = GetLogicalDrives();
    if(freeLetters < 4) return 0;
    char letter = 'C';
    for(unsigned long i=4; (freeLetters & i) != 0; ++letter, i <<= 1);
    return letter;
}
person zakinster    schedule 30.04.2013
comment
Я думаю, что мой случай может быть чем-то вроде MTP или что-то в этом роде, но я этого не знаю слишком хорошо, поэтому я бы предпочел, чтобы кто-нибудь более знающий ответил мне, если это единственная возможность. И вообще, как пользоваться API. Я не уверен, можно ли вообще смонтировать это устройство. - person akavel; 30.04.2013
comment
@akavel Да, извините, когда я прочитал USB Storage, я понял USB flash drive и не подумал о мультимедийных устройствах. Смотрите мой другой ответ, я, вероятно, удалю его. - person zakinster; 30.04.2013

да. В некоторых случаях USB-накопитель не имеет буквы.

  1. Устройство Bluetooth, USB-камера не имеет буквы диска. но это не ваш случай, поскольку вы упомянули запоминающее устройство.
  2. Запоминающее устройство USB, зарегистрированное на ПК, а не как запоминающее устройство. например. USB-проигрыватель MP3 (устройство MTP) будет определен как музыкальный проигрыватель и не имеет буквы диска.

Полагаю, ваш случай №2.

Чтобы получить доступ к файлам на запоминающем устройстве, вам необходимо принудительно смонтировать его как запоминающее устройство с буквой диска. Если у вас нет точки монтирования, вы не можете получить доступ к файлам, которые я считаю. Это зависит от устройств. Некоторые устройства (MTP) имеют внутренние настройки, позволяющие решить, обнаруживать их в качестве хранилища или нет. Вы можете изучить настройки устройства MTP.

В противном случае вам нужно принудительно смонтировать все устройства хранения с помощью кода.

person Murugan    schedule 02.05.2013
comment
Вы не можете подключить мультимедийное устройство, да и не требуется для передачи файлов. В этом весь смысл MTP / PTP, вам не нужно монтировать или отключать (извлекать) устройство, вам не нужен драйвер устройства, вы просто общаетесь с ним через трансферт прокотол. Если вы измените конфигурацию устройства, чтобы оно отображалось как USB Mass Storage, то это больше не устройство PTP / MTP (и это не всегда возможно). - person zakinster; 02.05.2013
comment
Также обратите внимание, что ваш первый и второй случаи одинаковы, USB-камера обычно является устройством PTP, а MP3-плеер или Android Phone - это обычно устройства MTP, но они оба являются запоминающими устройствами и используют один и тот же протокол. - person zakinster; 02.05.2013
comment
Дезинформируя ответ как таковой, он все еще был ценным, и я благодарен за него, поскольку он вообще ввел ключевое слово MTP в обсуждение ... - person akavel; 08.05.2013