[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
ChkDskGui (PureBasic) Исходник + EXE, v4.2 (x86, x64)Скачать yadi.sk upload.eeвременная версия


Последний раз редактировалось: AZJIO (2023-01-25 16:21), всего редактировалось 43 раз(а)

[Цитировать]

    vovan1982
  • 214
  • Стаж: 9 лет 2 месяца
  • Сообщений: 1099
  • Репутация:76

    [+] [-]
  • Откуда: Ростов-на-Дону
Joker-2013, привет. А можешь поделиться DiskPart GUI? Можно в личку.

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
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
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 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")

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 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
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
nikzzzz
я сделал почти готовую версию, какую лучше ком-строку передать для 1, 2, 3 дисков, чтобы я понял как её сформировать. Думаю через & команды новые продублировать и наверно заголовок менять в момент теста следующей строки, чтобы было понятно что какой диск на данный момент проверяется.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO,

[Цитировать]

    AZJIO
  • 17953
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
Joker-2013
вот
Сделал рабочую команду для проверки, можешь пробовать 2 флешки без галок, чтобы быстрее. Я же это спрашивал, как лучше и изначально выложил без этой команды.

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 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
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
nikzzzz
обновил, на пастбине, сделал вывод строки данных из листвью в консоль, теперь чётко видно.
Joker-2013
в статус бар теперь не совсем корректно указывать ком-строку, так как нет выбранного диска.
по поводу ширины у меня нет нижней прокрутки, но я понимаю шрифт может другой, тогда нужно найти аналог этого
GUICtrlSendMsg($ListView, $LVM_SETCOLUMNWIDTH, 0, 80) ; 80 пиксель. Если -1 ($LVSCW_AUTOSIZE), то устанавливает по длине текста.
тогда ширина колонок станет минимально возможной для умещения текста колонки.
Или хочешь чтобы стиль поменять без появления нижнего скрола при любых условия? Позже можно увеличения окна сделать, тоже как решение.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO,
Немножко увеличить с запасом, да и всё...
Не понял.. Очередь сделал или еще нет?


Последний раз редактировалось: Joker-2013 (2018-05-14 20:54), всего редактировалось 1 раз

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 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
  • Стаж: 6 лет 1 месяц
  • Сообщений: 1269
  • Репутация:126

    [+] [-]
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
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
53814И всё же есть 3-й путь?
Есть, \Windows\SysWOW64\chkdsk.exe, но он есть далеко не во всех WinPe.

[Цитировать]

    Joker-2013
  • 1039
  • Стаж: 8 лет 9 месяцев
  • Сообщений: 2053
  • Репутация:120

    [+] [-]
  • Откуда: из прошлого
AZJIO,

[Цитировать]

    gera_serg
  • 1171
  • Стаж: 8 лет 8 месяцев
  • Сообщений: 1421
  • Репутация:9

    [+] [-]
А в PE нет переменной %PATH% в виде списка каталогов ?

Страница 6 из 34


Показать сообщения:    

Текущее время: 18-Апр 20:52

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы