Хотелось бы узнать как программно открывать/закрывать дисковод. А если их несколько, то узнавать колличество и состояние (открыто/закрыто). Есть инфа, что якобы все это дело работает через AudioCD, но не знаю как..Объясните..
Работа с дисководами
Сообщений 1 страница 13 из 13
Поделиться208.08.2010 22:30:46
Вот пример
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) ; Закрываем лоток
Поделиться310.08.2010 16:36:11
To Count-1
зачем единицу отнимать?
И еще, в данном случае выводятся все подключенные USB устройства, а можно именно дисководы?
Поделиться410.08.2010 18:31:33
зачем единицу отнимать?
Попробуй не отними и увидишь что будет.
И еще, в данном случае выводятся все подключенные USB устройства, а можно именно дисководы?
У меня выводятся только CD/DVD, а флешек в списке нет.
Поделиться503.09.2010 20:32:18
Этот код работает почему то не так, как бы мне хотелось.
; 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 и нажимаем кнопку -работает
вынимаем диск и нажимаем кнопку , высвечивает ошибку: "Вставьте диск"
В чем может быть проблема или как избежать подобных ошибок-сообщений?
Поделиться603.09.2010 20:47:07
haav
так это же не ошибка, это запрос на диск: продолжить или отменить, у меня всегда при отсутствующем диске высвечивается этот запрос...
Поделиться703.09.2010 21:05:58
так это же не ошибка, это запрос на диск: продолжить или отменить, у меня всегда при отсутствующем диске высвечивается этот запрос...
Мне нужно считать размер диска(при имеющимся диске и неимеющимся в приводе) , а вместо этого данный запрос
Отредактировано haav (03.09.2010 21:07:40)
Поделиться803.09.2010 21:30:37
Функция GetDiskFreeSpace еще и врет если размер диска больше 2 гб.
Блин а с GetDiskFreeSpaceEx не выходит почему то.
Как записывающие проги считывают инфу?
Поделиться903.09.2010 21:42:03
так подойдет?
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)
Поделиться1003.09.2010 21:53:59
так подойдет?
Подойдет,спасибо!
Поделиться1103.09.2010 22:01:58
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
Отредактировано Adrenalin (03.09.2010 22:23:14)
Поделиться1203.09.2010 23:09:44
ну и чтоб совсем красиво было:
Все это у меня уже было реализовано, мне не хватало строки:
SetErrorMode_(#SEM_FAILCRITICALERRORS)
Хотя последний код имеет расхождения с системным по размеру диска в приводе. У меня практически так же. Видно винда как то по другому подсчитывает.
Поделиться1303.09.2010 23:18:15
haav
ага, тоже заметил, у меня разница в 700 метров получается...
.........................
по крайней мере если проверить сколько весят все папки на диске (выделить их и свойства тыкнуть), то цифра будет точна до последнего знака, а в свойствах привода не сходиться
Отредактировано Adrenalin (03.09.2010 23:20:30)
Похожие темы
Панель для Windows 7 | OpenSource | 04.09.2010 |