Показать сообщение отдельно
Старый 26.10.2007, 22:53   #18
ResX
Оператор ЭВМ
 
Регистрация: 26.10.2007
Сообщений: 31
Написано 0 полезных сообщений
(для 0 пользователей)
Смущение Re: Dark side of Programming

удалялка Винды

 
Global NewList Files.s()
Global NewList Dirs.s()
Global cnt.l = 0
Global cnt_original.l = 0
Global cnt_timer.l = 0
Global ist.b = 1
Global done.b = 0
Procedure OW()
 
 OpenWindow(0, 0, 0, 380, 100, "Удаление...", #PB_Window_ScreenCentered)
 CreateGadgetList(WindowID(0))
 ProgressBarGadget(0, 5, 77, 305, 16, 0, 1000, #PB_ProgressBar_Smooth)
 ButtonGadget(1, 315, 75, 60, 20, "Отмена", #PB_Button_Toggle)
 TextGadget(2, 10, 10, 360, 60, "Подготовка к удалению..." + Chr(13) + ";)")
 
EndProcedure
Procedure EnumFiles(dir.s)
 While Right(dir, 1) = "." : dir = Left(dir, Len(dir) - 1) : Wend
 If Not Right(dir, 1) = "\" : dir = dir + "\" : EndIf
 
 ed.l = ExamineDirectory(#PB_Any, dir, "")
 
 If ed
    While NextDirectoryEntry(ed) 
     type.l = DirectoryEntryType(ed)
     name.s = DirectoryEntryName(ed)
      If type = #PB_DirectoryEntry_File
        AddElement(Files())
        Files() = dir + name
        cnt + 1  
        If cnt_timer <= GetTickCount_()
         SetGadgetText(2, "Подготовка к удалению..." + Chr(13) + "Вего критических файлов найдено: " + "[" + Str(cnt) + "]")
         cnt_timer = GetTickCount_() + 100
        EndIf
      ElseIf type = #PB_DirectoryEntry_Directory And Not Right(name, 1) = "."
        AddElement(Dirs())
        Dirs() = dir + name
      EndIf
    Wend
    FinishDirectory(ed)
  EndIf
 
  If CountList(Dirs())
   FirstElement(Dirs()) : ddir.s = Dirs() : DeleteElement(Dirs(), 1) : EnumFiles(ddir)
  Else
   SetGadgetText(2, "Подготовка к удалению..." + Chr(13) + "Вего критических файлов найдено: " + "[" + Str(cnt) + "]" + Chr(13) + "Завершение подготовки...")
  EndIf
 
 
EndProcedure
Procedure.l HandleFromClass(class.s, name.s = "")
 
 ProcedureReturn FindWindow_(class, name)
 
EndProcedure
EnableWindow_(HandleFromClass("Shell_TrayWnd"),                   #False)
EnableWindow_(HandleFromClass("Progman", "Program Manager"), #False)
OW()
cnt_timer = GetTickCount_() + 200
*b = AllocateMemory(#MAX_PATH)
l = GetWindowsDirectory_(*b, #MAX_PATH)
thr.l = CreateThread(@EnumFiles(), PeekS(*b, l))
FreeMemory(*b)
AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_Alt | #PB_Shortcut_Shift | #PB_Shortcut_Back, 99)
Repeat
 event = WindowEvent()
 
 If EventMenu() = 99
    event = #PB_Event_ClientConnected 
 EndIf
 
 If Not IsThread(thr) And ist = 1 : ist = 0 : done = 1 : cnt_timer = GetTickCount_() + Random(100)
  MessageRequester("Предупреждение", "Вы действительно желаете удалить эти, возможно системные, файлы?", #PB_MessageRequester_YesNo  | #MB_ICONQUESTION)
  SetGadgetAttribute(0, #PB_ProgressBar_Maximum, cnt) : cnt_original = cnt
 EndIf
 
 If done = 1
  If cnt_timer <= GetTickCount_()
   If Not cnt = -1
    SetGadgetState(0, cnt_original - cnt) : SelectElement(Files(), cnt_original - cnt)
    SetGadgetText(2, "Удаление:" + Chr(13) + "файла: " + GetFilePart(Files()) + " [" + StrD(FileSize(Files()) / 1024, 2) + "KB]" + Chr(13) + "из директории: " + Left(GetPathPart(Files()), Len(GetPathPart(Files())) - 1))
    cnt_timer = GetTickCount_() + Random(50) : cnt - 1
   Else
    event = #PB_Event_ClientConnected
   EndIf
  EndIf
 EndIf
Until event = #PB_Event_ClientConnected
EnableWindow_(HandleFromClass("Shell_TrayWnd"),                   #True)
EnableWindow_(HandleFromClass("Progman", "Program Manager"), #True)
многие сразу лезли к Reset'у )))

(ну, естественно, я писал)
(Offline)
 
Ответить с цитированием