PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Работа с дисководами


Работа с дисководами

Сообщений 1 страница 13 из 13

1

Хотелось бы узнать как программно открывать/закрывать дисковод. А если их несколько, то узнавать колличество и состояние (открыто/закрыто). Есть инфа, что якобы все это дело работает через AudioCD, но не знаю как..Объясните..

0

2

Вот пример

Код:
Count=InitAudioCD() ; Число CD/DVD приводов
Debug "Число дисководов "+Str(Count)
For i=0 To Count-1
  UseAudioCD(i)
  Debug AudioCDName()
Next i

UseAudioCD(0) ; Выбираем нулевой привод
Debug "Активирован диск "+AudioCDName()
EjectAudioCD(1) ; Открываем лоток выбраного диска
EjectAudioCD(0) ; Закрываем лоток

0

3

Пётр написал(а):

To Count-1

зачем единицу отнимать?
И еще, в данном случае выводятся все подключенные USB устройства, а можно именно дисководы?

0

4

daiomik написал(а):

зачем единицу отнимать?

Попробуй не отними и увидишь что будет.

daiomik написал(а):

И еще, в данном случае выводятся все подключенные USB устройства, а можно именно дисководы?

У меня выводятся только CD/DVD, а флешек в списке нет.

0

5

Этот код работает почему то не так, как бы мне хотелось.

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 220, 0, 600, 300, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      ButtonGadget(#Button_0, 90, 110, 440, 80, "Проверяем")
  EndIf
EndProcedure
Open_Window_0()
Repeat
  ev=WaitWindowEvent()
  If ev=#PB_Event_Gadget
    If EventGadget()=#Button_0
      SectorsPerCluster.q : BytesPerSector.q : NumberOfFreeClusters.q : TotalNumberOfClusters.q 
      ; Результат будет нулевым в случае неудачи 
      Debug  GetDiskFreeSpace_("f:\",@SectorsPerCluster,@BytesPerSector,@NumberOfFreeClusters,@TotalNumberOfClusters) 
      Debug  SectorsPerCluster ; число секторов на кластер 
      Debug  BytesPerSector    ; число байт на сектор 
      Debug  NumberOfFreeClusters ; число свободных кластеров 
      Debug  TotalNumberOfClusters ; общее число кластеров на диске
    EndIf
  EndIf
  
Until ev=#PB_Event_CloseWindow

А именно:
нажимаем кнопку-работает
вставляем диск в CD-Rom и нажимаем кнопку -работает
вынимаем диск и нажимаем кнопку , высвечивает ошибку: "Вставьте диск"
В чем может быть проблема или как избежать подобных ошибок-сообщений?

0

6

haav написал(а):

haav

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

0

7

Adrenalin написал(а):

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

Мне нужно считать размер диска(при имеющимся диске и неимеющимся в приводе) , а вместо этого данный запрос

Отредактировано haav (03.09.2010 21:07:40)

0

8

Функция GetDiskFreeSpace еще и врет если размер диска больше 2 гб.  :angry: 
Блин а с GetDiskFreeSpaceEx не выходит почему то.
Как записывающие проги считывают инфу?

0

9

так подойдет?

Код:
Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Button_0
EndEnumeration

Procedure GetDiskInfo(*www)
 Protected SectorsPerCluster.q,BytesPerSector.q,NumberOfFreeClusters.q,TotalNumberOfClusters.q 
    SetErrorMode_(#SEM_FAILCRITICALERRORS) 
            If GetDiskFreeSpace_("j:\",@SectorsPerCluster,@BytesPerSector,@NumberOfFreeClusters,@TotalNumberOfClusters) 
                Debug  SectorsPerCluster ; число секторов на кластер 
                Debug  BytesPerSector    ; число байт на сектор 
                Debug  NumberOfFreeClusters ; число свободных кластеров 
                Debug  TotalNumberOfClusters ; общее число кластеров на диске
            Else
                Debug "Забыл диск запихать"
            EndIf
    SetGadgetText(#Button_0, "Можешь тыкать дальше на кнопку")
 DisableGadget(#Button_0,0)
EndProcedure


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 220, 0, 600, 300, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      ButtonGadget(#Button_0, 90, 110, 440, 80, "Проверяем")
  EndIf
EndProcedure

Open_Window_0()

Repeat
  ev=WaitWindowEvent()
  If ev=#PB_Event_Gadget
    If EventGadget()=#Button_0
        CreateThread(@GetDiskInfo(),10) : SetGadgetText(#Button_0, "Погоди, не торопись, дай прочитать твой поцарапанный диск")
        DisableGadget(#Button_0,1)
    EndIf
  EndIf
Until ev=#PB_Event_CloseWindow

Отредактировано Adrenalin (03.09.2010 21:43:20)

0

10

Adrenalin написал(а):

так подойдет?

Подойдет,спасибо!

0

11

haav написал(а):

haav

ну и чтоб совсем красиво было:

Код:
Structure int64
  Long1.l
  Long2.l
EndStructure

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Button_0
EndEnumeration

Procedure.s FindCDROM()
Protected *DriveBuffer = AllocateMemory(255),result.s
    For i = 0 To GetLogicalDriveStrings_(255, *DriveBuffer)
        DriveL = PeekB(*DriveBuffer + i)
        Drives.s = Drives.s + Chr(DriveL)
    Next
        Slash = CountString(Drives,"\")
            For Divide = 1 To Slash
                DriveLetter.s = StringField(Drives,Divide,"\")+"\"
                If DriveLetter <> ""
                        If GetDriveType_(DriveLetter)=5
                            result=DriveLetter
                        EndIf 
                EndIf
            Next Divide
ProcedureReturn result
EndProcedure

Procedure GetDiskInfo(*www)
 Protected SectorsPerCluster.q,BytesPerSector.q,NumberOfFreeClusters.q,TotalNumberOfClusters.q 
 ActivateKeyboardLayout_(1033,0)
 drive$=InputRequester("Поиск диска","Введите букву диска:",Left(FindCDROM(),1))+":\"
    SetErrorMode_(#SEM_FAILCRITICALERRORS) 
            If GetDiskFreeSpaceEx_(@drive$, BytesFreeToCaller.int64, TotalBytes.int64, TotalFreeBytes.int64)
                Debug "Занято:  " + Str(((TotalBytes\Long1 >> 20) & $FFF) | (TotalBytes\Long2 << 12))+" МБ"
                Debug "Свободно:  " + Str(((TotalFreeBytes\Long1 >> 20) & $FFF) | (TotalFreeBytes\Long2 << 12))+" МБ"
            Else
                Debug "Забыл диск запихать"
            EndIf
    SetGadgetText(#Button_0, "Можешь тыкать дальше на кнопку")
 DisableGadget(#Button_0,0)
EndProcedure

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 220, 0, 600, 300, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      ButtonGadget(#Button_0, 90, 110, 440, 80, "Проверяем")
  EndIf
EndProcedure

Open_Window_0()

Repeat
  ev=WaitWindowEvent()
  If ev=#PB_Event_Gadget
    If EventGadget()=#Button_0
        CreateThread(@GetDiskInfo(),10) : SetGadgetText(#Button_0, "Погоди, не торопись, дай прочитать твой поцарапанный диск")
        DisableGadget(#Button_0,1)
    EndIf
  EndIf
Until ev=#PB_Event_CloseWindow

:idea:

Отредактировано Adrenalin (03.09.2010 22:23:14)

0

12

Adrenalin написал(а):

ну и чтоб совсем красиво было:

Все это у меня уже было реализовано, мне не хватало строки:

Код:
 SetErrorMode_(#SEM_FAILCRITICALERRORS)

Хотя последний код имеет расхождения с системным по размеру диска в приводе. У меня практически так же. Видно винда как то по другому подсчитывает.

0

13

haav написал(а):

haav

ага, тоже заметил, у меня разница в 700 метров получается...

.........................

по крайней мере если проверить сколько весят все папки на диске (выделить их и свойства тыкнуть), то цифра будет точна до последнего знака, а в свойствах привода не сходиться

Отредактировано Adrenalin (03.09.2010 23:20:30)

0

Похожие темы


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Работа с дисководами