AZJIO
![17953](https://usbtor.ru/./data/avatars//1/53/17953.jpg) ![](styles/images/ranks/inj.png) - Стаж: 6 лет 11 месяцев
- Сообщений: 1317
- Репутация:127[+] [-]
|
ChkDskGui (PureBasic)
Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия
Последний раз редактировалось: AZJIO (2024-11-07 09:05), всего редактировалось 44 раз(а)
|
vovan1982
![214](https://usbtor.ru/./data/avatars//0/14/214.jpg) ![](styles/images/ranks/inj.png) - Стаж: 10 лет
- Сообщений: 1139
- Репутация:78[+] [-]
- Откуда: Ростов-на-Дону
|
Joker-2013, привет. А можешь поделиться DiskPart GUI? Можно в личку.
|
![](/styles/templates/default/images/shift/post_offline.png) Отправлено: 14-Май-2018 17:10
(спустя 1 час 19 минут)
AZJIO
![17953](https://usbtor.ru/./data/avatars//1/53/17953.jpg) ![](styles/images/ranks/inj.png) - Стаж: 6 лет 11 месяцев
- Сообщений: 1317
- Репутация:127[+] [-]
|
nikzzzz Вот листвью начал изучать (обновил 3 раза)Declare ComboListDrive(List Drive.s()) Declare GetDrives(List Drive.s()) Declare.s FormatSizeDisk(Num.q) Declare.s DriveGetNumber(Sring$) Declare.s DriveGetNumber(Sring$) ; Dim DriveAr.s(0) NewList Drive.s() NewList ico() ; Dim ico(0) ; ListIconGadget в действии... If OpenWindow(0, 0, 0, 480, 200, "Будущий чекдиск", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ; Левый столбец. Список со значками с чек-боксом, выделять однос строкой ListIconGadget(0, 5, 5, 470, 120, "-Диск-", 60, #PB_ListIcon_CheckBoxes | #PB_ListIcon_FullRowSelect) ; If LoadFont(0,"Courier New",9) ; SetGadgetFont(0, FontID(0)) ; Установить загруженный шрифт Courier 10 как новый стандарт ; EndIf SetGadgetColor(0 , #PB_Gadget_BackColor , RGB(55, 55, 55)) SetGadgetColor(0 , #PB_Gadget_FrontColor , RGB(180, 180, 180)) If OSVersion() >= #PB_OS_Windows_7 SetGadgetFont(0, LoadFont(0, "Consolas", 9)) Else SetGadgetFont(0, LoadFont(0, "Courier New", 9)) EndIf ; для иконок 16х16 SetGadgetAttribute(0, #PB_ListIcon_DisplayMode, #PB_ListIcon_Report) ; вид таблица ; AddGadgetItem(0, 1, "Картинка 1", ImageID(0)) ; ListIconGadget(5, 360, 220, 330, 65, "", 200,#PB_ListIcon_GridLines) file$ = "C:" i=1 hIco=ExtractAssociatedIcon_(GetModuleHandle_(0), @file$, @i) ; Добавить ещё 5 колонок AddGadgetColumn(0, 2, "- № -", 50) AddGadgetColumn(0, 3, "-Тип-", 55) AddGadgetColumn(0, 4, "- Метка -", 125) AddGadgetColumn(0, 5, "- FS -", 65) AddGadgetColumn(0, 6, "-Размер-", 95) GetDrives(Drive()) SizeDrive = ListSize(Drive()) ; ReDim DriveAr.s(SizeDrive, 4) ComboListDrive(Drive()) ; Получение списка дисков FIXED REMOVABLE ForEach Drive.s() file$ = LSet(Drive(), 2) i=1 AddGadgetItem(0, -1, Drive.s(), ExtractAssociatedIcon_(GetModuleHandle_(0), @file$, @i)) Next ButtonGadget(6, 330, 147, 90, 32, "Старт") Repeat Event = WaitWindowEvent() If Event = #PB_Event_Gadget Select EventGadget() Case 6 ; Старт res$ = "" For k = 0 To CountGadgetItems(0)-1 If GetGadgetItemState(0, k) & #PB_ListIcon_Checked res$ + GetGadgetItemText(0, k) + #CR$ EndIf Next MessageRequester("Выбранные", res$) EndSelect EndIf Until Event = #PB_Event_CloseWindow EndIf ; Получить буквы дисков Procedure GetDrives(List Drive.s()) Define.i drives_avail drives_avail = GetLogicalDrives_() For i = 0 To 31 If ((drives_avail >> i) & 1) AddElement(Drive()) : Drive() = Chr(i + 65) EndIf Next EndProcedure Procedure ComboListDrive(List Drive.s()) Define.l Serial, type, i Define.s Lfwrk, FileSystem, VolName, r Define.q total_bytes r = Chr(10) ForEach Drive.s() Lfwrk=Drive.s()+":\" type =GetDriveType_(Lfwrk) FileSystem = Space(256) VolName= Space(256) GetVolumeInformation_(@Lfwrk, @VolName, 255, @Serial, 0, 0, @FileSystem, 255) Select type Case 2 ; Drive()+": Rem " Drive()+":" + r + "[" + DriveGetNumber(LSet(Drive(),1) + ":") + "]" + r + "Rem " Case 3 ; Drive()+": Fixed " Drive()+":" + r + "[" + DriveGetNumber(LSet(Drive(),1) + ":") + "]" + r + "Fixed" Default DeleteElement(Drive()) Continue EndSelect ; Drive() = DriveGetNumber(LSet(Drive(),1) + ":") + " " + Drive() Drive() + r + VolName + r + FileSystem If (GetDiskFreeSpaceEx_(Lfwrk, 0, @total_bytes, 0)) ; Drive() + " "+ Str(total_bytes/1048576)+ " Мб" Drive() + r + FormatSizeDisk(total_bytes) EndIf Next EndProcedure ;Получение номера диска и раздела, из буквы раздела Procedure.s DriveGetNumber(DriveLetter$) Protected DriveInfo.STORAGE_DEVICE_NUMBER, Ret$="?:?", hDevice = CreateFile_("\\.\" + DriveLetter$, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #NUL) If hDevice If DeviceIoControl_(hDevice,#IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, DriveInfo, SizeOf(STORAGE_DEVICE_NUMBER), #NUL, #NUL) Ret$=Str(DriveInfo\DeviceNumber) + ":" + Str(DriveInfo\PartitionNumber) EndIf CloseHandle_(hDevice) EndIf ProcedureReturn Ret$ EndProcedure ; форматирует число в формат "0,5 Гб", "500 Гб" Procedure.s FormatSizeDisk(Num.q) Define.s snum Define.f total_gb snum = StrF(Num/1024) total_gb = ValF(snum) total_gb = total_gb/1048576 snum =StrF(total_gb,3) snum =RSet(snum, 8) + " Гб" ; Debug Len(snum) ProcedureReturn snum EndProcedure но если уж делать, нужно делать отдельные очереди для каждого физического диска, и запускать отдельный процесс для каждой очереди. Я про это и имел ввиду, допустим у диска 4 раздела, мы получаем отмеченные диски и смотрим диски с одинаковым физическим корнем и посылаем их в одну очередь, а если диск другой, то во второй список для второго потока. если получаем 3 списка, то делим экран на 3 части и запускаем три потока. Мне уже кажется это решаемым. Но ведь заметная экономия, если чел выберет разные диски и каждый будет требовать от 20 мин до 1 часа, то через час он проверит все диски, или это время складывать и проверять 2-3 часа. vovan1982 в гугле легко находится "winpe diskpart gui micro"
Последний раз редактировалось: AZJIO (2018-05-14 17:51), всего редактировалось 2 раз(а)
|
Joker-2013
![1039](https://usbtor.ru/./data/avatars//0/39/1039.jpg) ![](styles/images/ranks/inj.png) - Стаж: 9 лет 7 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO, Можно размещать текст по центру колонки... Посмотри в моей программе...Дополнительная информацияProcedure ListIconAlligment(id, Alligment$) ;Alligment$ = "rrcll" ;[one character]=[one column]; R=Right, L=Left, C=Center ;id=GadgetID(#ListIcon_0) Protected ListViewHandle=id, i Protected ListViewCol.LV_COLUMN ; для управления столбцом ListViewCol\mask = #LVCF_FMT Alligment$=UCase(Alligment$) ;большие буквы For i=1 To Len(Alligment$) Select Mid(Alligment$,i,1) ; одна буква Case "R" ListViewCol\fmt = #LVCFMT_RIGHT ; выравнивать по правому краю Case "C" ListViewCol\fmt = #LVCFMT_CENTER Case "L" ListViewCol\fmt = #LVCFMT_LEFT Default ListViewCol\fmt = #LVCFMT_LEFT EndSelect SendMessage_(ListViewHandle, #LVM_SETCOLUMN, i-1, @ListViewCol) Next EndProcedure ListIconAlligment(GadgetID(0), "lcclcc")
|
![](/styles/templates/default/images/shift/post_offline.png) Отправлено: 14-Май-2018 18:39
(спустя 1 час 15 минут)
nikzzzz
![215](https://usbtor.ru/./data/avatars//0/15/215.gif) ![](styles/images/ranks/inj.png) - Стаж: 10 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
Все-таки получил не мерцающее окно при выводе.Structure ScreenBuff Buffer.s StringCount.l EndStructure Import "user32.lib" OemToCharBuffA(*Buff,*Buff1,SizeBuff) EndImport Procedure.s ReadProgramStringOem(iPid) Protected Ret$="" Protected SizeBuff=AvailableProgramOutput(iPid) If SizeBuff>0 Protected *Buff=AllocateMemory(SizeBuff) ReadProgramData(iPid,*Buff,SizeBuff) OemToCharBuffA(*Buff,*Buff,SizeBuff) Ret$=PeekS(*Buff,SizeBuff,#PB_Ascii) FreeMemory(*Buff) EndIf ProcedureReturn Ret$ EndProcedure Procedure SetTxt(Gadget, *Buff.ScreenBuff) Protected i,Sym$,Str1$="",Flag=0 RemoveGadgetItem(Gadget,*Buff\StringCount) For i=1 To Len(*Buff\Buffer) Sym$=Mid(*Buff\Buffer,i,1) Select Sym$ Case Chr(10) SetGadgetItemText(Gadget,*Buff\StringCount,Str1$ + Chr(10)) *Buff\StringCount + 1 Str1$="" Flag=0 Case Chr(13) Flag=1 Default If Flag=1 Str1$="" Flag=0 EndIf Str1$+Sym$ EndSelect Next *Buff\Buffer=Str1$ If Str1$<>"" SetGadgetItemText(Gadget,*Buff\StringCount,Str1$) If Flag:*Buff\Buffer+Chr(13):EndIf EndIf SendMessage_(GadgetID(Gadget),#EM_SCROLL,#SB_BOTTOM,0) EndProcedure Procedure Chkdsk() ; Protected iPid = RunProgram("cmd.exe", "/c tracert usbtor.ru", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide) ; Protected iPid = RunProgram("cmd.exe", "/c chkdsk d: /f /x", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide) Protected iPid = RunProgram("cmd.exe", "/c chkdsk c: ", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide) Protected Str$, Buff.ScreenBuff Buff\Buffer="" Buff\StringCount=0 If iPid While ProgramRunning(iPid) If WaitWindowEvent(100) = #PB_Event_CloseWindow If MessageRequester("Внимание!", "Идет сканирование диска..."+Chr(10)+"Закрыть программу?", #PB_MessageRequester_YesNo | #MB_ICONQUESTION)=6 CloseProgram(iPid) End EndIf EndIf Str$=ReadProgramStringOem(iPid) If Str$ Buff\Buffer + Str$ SetTxt(Gadget,Buff) ; Sleep_(250) EndIf Wend CloseProgram(iPid) ; Close the connection to the program EndIf EndProcedure Procedure SizeWindowHandler() ResizeGadget(0,0,0,WindowWidth(0),WindowHeight(0)) EndProcedure OpenWindow(0, 44, 16, 700, 300, "CHKDSK GUI", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) SendMessage_(WindowID(0),#WM_SETICON,0,ExtractIcon_(0,"Shell32.dll",270)) BindEvent(#PB_Event_SizeWindow, @SizeWindowHandler()) SmartWindowRefresh(0, #True) WindowBounds(0, 500, 200, #PB_Ignore, #PB_Ignore) EditorGadget(0, 0, 0, 700, 300, #PB_Editor_ReadOnly) SendMessage_(GadgetID(0),#EM_SETTARGETDEVICE, #Null, 0) SetGadgetFont(0, LoadFont(0, "Courier New", 10)) Chkdsk() Repeat Until WaitWindowEvent() = #PB_Event_CloseWindow
|
AZJIO
![17953](https://usbtor.ru/./data/avatars//1/53/17953.jpg) ![](styles/images/ranks/inj.png) - Стаж: 6 лет 11 месяцев
- Сообщений: 1317
- Репутация:127[+] [-]
|
nikzzzz я сделал почти готовую версию, какую лучше ком-строку передать для 1, 2, 3 дисков, чтобы я понял как её сформировать. Думаю через & команды новые продублировать и наверно заголовок менять в момент теста следующей строки, чтобы было понятно что какой диск на данный момент проверяется.
|
Joker-2013
![1039](https://usbtor.ru/./data/avatars//0/39/1039.jpg) ![](styles/images/ranks/inj.png) - Стаж: 9 лет 7 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO,
|
AZJIO
![17953](https://usbtor.ru/./data/avatars//1/53/17953.jpg) ![](styles/images/ranks/inj.png) - Стаж: 6 лет 11 месяцев
- Сообщений: 1317
- Репутация:127[+] [-]
|
Joker-2013 вот Сделал рабочую команду для проверки, можешь пробовать 2 флешки без галок, чтобы быстрее. Я же это спрашивал, как лучше и изначально выложил без этой команды.
|
nikzzzz
![215](https://usbtor.ru/./data/avatars//0/15/215.gif) ![](styles/images/ranks/inj.png) - Стаж: 10 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
AZJIO,53807какую лучше ком-строку передать для 1, 2, 3 дисков, чтобы я понял как её сформировать. Примерно такую, пример для двух разделов (без ключей)cmd /c @echo off & color 0e & cls & title Check drive c: & echo.Check drive c: & chkdsk.exe c: & title Check drive e: & echo. & echo.Check drive e: & chkdsk.exe e: & set /p=^>^>
|
AZJIO
![17953](https://usbtor.ru/./data/avatars//1/53/17953.jpg) ![](styles/images/ranks/inj.png) - Стаж: 6 лет 11 месяцев
- Сообщений: 1317
- Репутация:127[+] [-]
|
nikzzzz обновил, на пастбине, сделал вывод строки данных из листвью в консоль, теперь чётко видно. Joker-2013 в статус бар теперь не совсем корректно указывать ком-строку, так как нет выбранного диска. по поводу ширины у меня нет нижней прокрутки, но я понимаю шрифт может другой, тогда нужно найти аналог этогоGUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, 80) ; 80 пиксель. Если -1 ($LVSCW_AUTOSIZE), то устанавливает по длине текста. тогда ширина колонок станет минимально возможной для умещения текста колонки. Или хочешь чтобы стиль поменять без появления нижнего скрола при любых условия? Позже можно увеличения окна сделать, тоже как решение.
|
Joker-2013
![1039](https://usbtor.ru/./data/avatars//0/39/1039.jpg) ![](styles/images/ranks/inj.png) - Стаж: 9 лет 7 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO, Немножко увеличить с запасом, да и всё... Не понял.. Очередь сделал или еще нет?
Последний раз редактировалось: Joker-2013 (2018-05-14 20:54), всего редактировалось 1 раз
|
nikzzzz
![215](https://usbtor.ru/./data/avatars//0/15/215.gif) ![](styles/images/ranks/inj.png) - Стаж: 10 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
AZJIO, Поправь функцию для совместимости с Win7;Получение номера диска и раздела, из буквы раздела Procedure.s DriveGetNumber(DriveLetter$) Protected DriveInfo.STORAGE_DEVICE_NUMBER, Nul , Ret$="?:?", hDevice = CreateFile_("\\.\" + DriveLetter$, 0, 0, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #NUL) If hDevice If DeviceIoControl_(hDevice,#IOCTL_STORAGE_GET_DEVICE_NUMBER, 0, 0, DriveInfo, SizeOf(STORAGE_DEVICE_NUMBER), @Nul, #NUL) Ret$=Str(DriveInfo\DeviceNumber) + ":" + Str(DriveInfo\PartitionNumber) EndIf CloseHandle_(hDevice) EndIf ProcedureReturn Ret$ EndProcedure
|
AZJIO
![17953](https://usbtor.ru/./data/avatars//1/53/17953.jpg) ![](styles/images/ranks/inj.png) - Стаж: 6 лет 11 месяцев
- Сообщений: 1317
- Репутация:127[+] [-]
|
nikzzzzТам всего два адреса, \Windows\System32 и для X64 \Windows\Sysnative . Если ChkDskGui.exe x86 версии, она будет искать chkdsk.exe в \Windows\SysWOW64\ , а там его нет. И всё же есть 3-й путь? подправил Joker-2013 колонки проверь, я всё же нашёлSetGadgetItemAttribute(0 , 2 , #PB_ListIcon_ColumnWidth , -2, k) хотя -1 тут не сработал, а -2 у меня терпимо
|
nikzzzz
![215](https://usbtor.ru/./data/avatars//0/15/215.gif) ![](styles/images/ranks/inj.png) - Стаж: 10 лет
- Сообщений: 3114
- Репутация:127[+] [-]
|
53814И всё же есть 3-й путь? Есть, \Windows\SysWOW64\chkdsk.exe, но он есть далеко не во всех WinPe.
|
Joker-2013
![1039](https://usbtor.ru/./data/avatars//0/39/1039.jpg) ![](styles/images/ranks/inj.png) - Стаж: 9 лет 7 месяцев
- Сообщений: 2053
- Репутация:120[+] [-]
- Откуда: из прошлого
|
AZJIO, ![](https://b.radikal.ru/b31/1805/78/e10451bfb9f7.png)
|
Страница 6 из 34
Текущее время: 16-Фев 18:15
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|