Как проверить доступность диска

Раздел посвящен программированию с использованием Power Basic.
ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Как проверить доступность диска

Сообщение ger_kar » 14.04.2012 (Сб) 17:39

Каким образом можно проверить доступность диска, т.е. вставлен диск (флеш карта) или нет.
Если проверять такими средствами как Dir$, FindFirstFile, IsFolder и т.п., то при отсутствии диска генерируется исключение.
Исключение.jpg
Исключение.jpg (13.88 Кб) Просмотров: 3577
Бороться и искать, найти и перепрятать

Kroos
Обычный пользователь
Обычный пользователь
 
Сообщения: 55
Зарегистрирован: 21.02.2012 (Вт) 16:57

Re: Как проверить доступность диска

Сообщение Kroos » 14.04.2012 (Сб) 20:00

GetLogicalDriveStrings

Например:
Код: Выделить всё
#COMPILE EXE
#DIM ALL

DECLARE FUNCTION GetLogicalDriveStrings LIB "kernel32" ALIAS _
"GetLogicalDriveStringsA" (BYVAL nBufferLength AS LONG, _
BYVAL lpBuffer AS ASCIIZ PTR) AS LONG

FUNCTION IsDriveExists(BYVAL sDrive AS STRING) AS BYTE

IF LEN(sDrive) = 0 THEN EXIT FUNCTION
DIM DrvList(1024) AS BYTE
LOCAL DrvPtr AS ASCIIZ PTR
LOCAL Drv AS STRING
DrvPtr = VARPTR(DrvList(0))
GetLogicalDriveStrings(1024, BYVAL DrvPtr)
    DO
        Drv = @DrvPtr
            IF INSTR(1, Drv, LEFT$(sDrive, 1)) > 0 THEN
                FUNCTION = 1 : EXIT FUNCTION
            END IF
        DrvPtr = DrvPtr + LEN(Drv) + 1
    LOOP UNTIL LEN(Drv) = 0
FUNCTION = 0

END FUNCTION

FUNCTION PBMAIN () AS LONG
?STR$(IsDriveExists("C"))
?STR$(IsDriveExists("D:\..."))
END FUNCTION 


более интересный вариант - _http://www.powerbasic.com/support/pbforums/showthread.php?t=47055

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как проверить доступность диска

Сообщение Sam777e » 14.04.2012 (Сб) 20:08

Прошу прощения - никогда не имел дела с Power Basic

Но ..

В VB просто написал бы

Код: Выделить всё
On Error Resume Next
' Обращаемся к устройству
' Если ЕСТЬ ошибка, то изучаем / обрабатываем ее [ номер, описание ... ] и получаем ответ.

Вероятно, и исключения предоставляют возможности / пищу для размышлений; по крайней мере, в других языках дело обстоит именно таким образом.

С уважением
Здоровья и удачи

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как проверить доступность диска

Сообщение jangle » 14.04.2012 (Сб) 20:50

ger_kar писал(а):Каким образом можно проверить доступность диска, т.е. вставлен диск (флеш карта) или нет.
Если проверять такими средствами как Dir$, FindFirstFile, IsFolder и т.п., то при отсутствии диска генерируется исключение.
Исключение.jpg


У меня на картридере такая ошибка если даже из проводника обратится к диску в который не вставлена флеш-карта.
Т.е. как бы с точки зрения ОС диск есть, но поскольку карта не вставлена происходит ошибка.
Имхо тут проблема в кривом драйвере картридера, поскольку это окно с ошибкой возникает всегда.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как проверить доступность диска

Сообщение ger_kar » 14.04.2012 (Сб) 21:24

jangle писал(а):У меня на картридере такая ошибка если даже из проводника обратится к диску в который не вставлена флеш-карта
У меня если смотреть в консоли управления дисками хорошо видно, что диск отсутствует, значит система об этом каким-то образом узнает. Не посредством же обработки исключений. Наверное есть что-то поприличнее, вот только что?
Упр. дисками.jpg
Упр. дисками.jpg (15.75 Кб) Просмотров: 3558

У меня при попытке доступа через проводник, появляется вот такой диалог:
Диалог.jpg
Диалог.jpg (10.01 Кб) Просмотров: 3558
Бороться и искать, найти и перепрятать

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как проверить доступность диска

Сообщение ger_kar » 14.04.2012 (Сб) 21:35

Sam777e писал(а):В VB просто написал бы ... On Error Resume Next
Ну тогда если через обработку ошибок делать, то надо On Error Goto Err_Handler. А с On Error Resume Next Ничего не поймается :).

Kroos писал(а):GetLogicalDriveStringsНапример:
Этот код опрашивает доступные устройства, в число которых попадают и устройства с отсутсвующими носителями. Таким образом приведенный пример делает совершенно не то что надо. Код по ссылке тоже не совсем то. Хотя из него я узнал про режимы и функцию SetErrorMode, про которые раньше ничего не ведал. Таким образом окно как подавить я теперь знаю, но все равно хочется чего нибудь по изящней :).
Бороться и искать, найти и перепрятать

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как проверить доступность диска

Сообщение Sam777e » 15.04.2012 (Вс) 5:01

ger_kar писал(а): Sam777e писал(а):В VB просто написал бы ... On Error Resume Next

Ну тогда если через обработку ошибок делать, то надо On Error Goto Err_Handler. А с On Error Resume Next Ничего не поймается :).


Неверно.

Читать надо несколько внимательнее /* а также учить матчасть ;-) */, так как я уже писал
Sam777e писал(а):
Код: Выделить всё
' Если ЕСТЬ ошибка, то изучаем / обрабатываем ее [ номер, описание ... ] и получаем ответ.


т.е. следующей строкой должно идти

Код: Выделить всё
If Err then
  '  А вот тут надо пораскинуть умом и ОБРАБОТАТЬ "ошибку"
  '  а, если сказать точнее, информацию любезно предоставленную тебе системой
End If


Пример

Код: Выделить всё
Public Sub TryDrive(S As String)
  Dim V As Variant
 
  On Error Resume Next
    V = Dir(S)
      '  Err.Clear     '  <==
    If Err Then
      MsgBox Err.Description, , Err.Number
    End If
    Err.Clear
  On Error GoTo 0
End Sub


Public Sub Test()
  TryDrive "E:\"
End Sub

При РАСКОММЕНТИРОВАННОЙ [ помеченной ] строке ошибки не будет. А когда этой строки нет [ т.е. она закомментирована - лучше ее вообще убрать, показана только для полноты картины ] то у меня [ , в Excel' e - 2010, WXP, E: соответствует разъему USB, физически флешку не вставлял за отсутствием оной, ] как и положено выскакивает

TryDrive.PNG


Конечно, эксперимент не абсолютно чистый - флешки то нет, может именно с флешкой ошибки и не перехватываются - но пара On Error Resume Next + If Err Then это очень простая и широко применяемая технология, можешь сам пробовать. Сравни Try + Catch .
Здоровья и удачи

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как проверить доступность диска

Сообщение ger_kar » 15.04.2012 (Вс) 8:25

Sam777e писал(а):Читать надо несколько внимательнее /* а также учить матчасть */, так как я уже писал
Дык матчасть в этом направлении изучена вдоль и поперек, в т.ч. и на уровне машинных кодов :) Про способ, который описан далее я в принципе теоретически знаю. Теоретически, потому, что на практике, именно в таком виде я его никогда такой способ не использовал. Еще с до VB' шных времен привык к On Error Goto, поэтому если надо обработать ошибку, а не просто ее пропустить всегда делал это в отдельном обработчике, ссылка на метку которого указывалась в On Error Goto. И привык настолько что делается это машинально. Поэтому когда прочитал On Error Resume Next, то это у меня никак не за ассоциировалось с обработкой ошибки :), скорее наоборот.

Вобщем долгие поиски таки привели к успеху, ибо проблема все таки оказалась решаемой и без отлавливания ошибки.
Достаточно вызвать
lRes = GetVolumeInformationW(ByCopy swDrive, ByVal %NULL, 0, 0, 0, 0, ByVal %NULL, 0)
В swDrive передаем наименование диска, и после вызова будем иметь в lRes - 1 если диск(карта) вставлена и 0 в противном случае.

И еще убедился в том, что обработчик ошибок у PB весьма корявый. Т.е. способ, который предложил Sam777e и который прекрасно работает в VB, и и просто должен был-бы работать и у PB, в действительности нифига не работает. Если возникшее описанное в этой теме исключение в VB ловится обработчиком на раз, то в PB оно вообще никак не ловится, Err всегда пустой. Даже если принудительно установить через SetErrorMode режим SEM_FAILCRITICALERRORS, то и в этом случае просто подавляется вывод окна, но обработчик PB и в этом случае ничего не ловит. Не ловит и все тут! Хотя должен. Потому что
MSDN писал(а):SEM_FAILCRITICALERRORS
0x0001

Система не отображает критической ошибки обработчика окна сообщения. Вместо этого, система посылает ошибки вызывающему процессу.

Лучшая практика такова, что все приложения вызывают для всего процесса SetErrorMode функцию с параметром SEM_FAILCRITICALERRORS при запуске. Это сделано для предотвращения диалогов ошибки и режима зависания приложения
Бороться и искать, найти и перепрятать


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

    TopList