Хотелось бы узнать как программно открывать/закрывать дисковод. А если их несколько, то узнавать колличество и состояние (открыто/закрыто). Есть инфа, что якобы все это дело работает через 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 |