застрял с API GetDriveType - PullRequest
       0

застрял с API GetDriveType

0 голосов
/ 29 апреля 2011

Я как бы застрял с этим API GetDriveType(). Каждый раз, когда этот API возвращает мне DRIVE_NO_ROOT_DIR, я передаю буквы дисков, такие как «c: \» и т. Д. Даже для моего основного диска «c: \» API возвращает то же самое.

Я позвонил GetLogicalDrives() перед этим, чтобы получить.

ОС: WinXP sp3, файловая система NTFS

код: компилятор VS2005

int main() { 
    bool folder; 
    String * filename; 
    char individualdrive[4],alldrives[100]; 
    memset(alldrives,0,100); 

    GetLogicalDriveStringsA(100,alldrives); 

    for(int i=0;(i<100)&&(alldrives[i]);i+=4) { 
        memset(individualdrive,0,4); 
        strncpy(individualdrive,alldrives+i,4); //extracting individual drive strings.
        if(DRIVE_FIXED == GetDriveTypeW((LPCWSTR)individualdrive)) 
            getfile((System::String*)individualdrive, filename,folder); }
   return 0; }

Ответы [ 2 ]

3 голосов
/ 29 апреля 2011

Без кода мы должны угадать.Мои предположения:

  • Вам не удалось экранировать \ как "C:\\".
  • Вы передаете строку ANSI в версию API Unicode или наоборот.

Очень трудно понять, как API мог потерпеть неудачу, если это не было ошибкой кодирования такого рода.


После добавления кода в ваш вопрос теперь ясно, чтоВторым из этих пунктов является объяснение.Вы передаете строковые данные ANSI в Unicode API, и это, конечно, не удается.

Чтобы исправить это, вам, вероятно, лучше всего переключить весь код на использование строк Unicode.

В дополнение кПроблемы с Unicode / ANSI, я думаю, что код обработки буфера подозрительный.Я не знаю, почему вы берете 4 символа на диск.Я думаю, что GetLogicalDriveStrings может возвращать не отображенные диски.

1 голос
/ 29 апреля 2011

Предполагается, что вы передадите корневой каталог диска, так что это будет:

GetDriveType( "C:\\" );

Обратите внимание на двойной обратный слеш - обратный слэш - это специальный символ «escape» в строковых литералах C и C ++,и должен быть экранирован сам.

Следующий код возвращает мне 3, что означает фиксированный диск:

#include <iostream>
#include <windows.h>
using namespace std;

int main() {
    cout << GetDriveType( "C:\\" ) << endl;
}

В следующем коде перечислены все диски в моей системе вместе с числовымзначение для их типа:

#include <windows.h>
#include <iostream>
using namespace std;

int main() {
    const int BUFSIZE = 100;
    char buffer[ BUFSIZE ];
    DWORD n = GetLogicalDriveStrings( BUFSIZE, buffer );
    DWORD i =  0;
    while( i < n )   {
        int t = GetDriveType( &buffer[i] );
        cout << &buffer[i] << " type is " << t << endl;
        i += strlen( &buffer[i] ) + 1 ;
    }
}

производство:

C:\ type is 3
D:\ type is 5
E:\ type is 5
F:\ type is 2
Q:\ type is 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...