Wo ist der Fehler? [Gelöst]

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Sauer-RAM
Beiträge: 326
Registriert: 13.04.2009 16:22
Computerausstattung: Lenovo ThinkPad X230t Convertible
Wohnort: Haslach i. K.

Wo ist der Fehler? [Gelöst]

Beitrag von Sauer-RAM »

Hi,
Ich wollte ein Programm schreiben das Daten sicher löschen kann. Also das es z.B. PC Inspector File Recovery nicht mehr wiedererstellen kann. Ich hab sowas schon zweimal erfolgreich programmiert. Allerdings konnte man bei den anderen Programmen nur eine Datei auf einmal löschen und ich wollte das mal mit einer Liste probieren, aber irgendwie funktioniert das nicht so wie ich das gerne hätte: Er löscht einfach nicht und wenn dann nur manchmal einen Teil der Liste. Es ist wirklich komisch. Ich hab schon selber nach dem Fehler gesucht aber ich find ihn nicht. Ich hoffe ihr könnt mir da weiterhelfen. Für den Code entschuldige ich mich schonmal, da ich schon ziemlich viel dran rumgemacht habe :bluescreen: . Ich blick ihn langsam selber nicht mehr.

Code: Alles auswählen

Global Eintrag = -1
Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Explorer
  #Frame3D_0
  #List
  #Aktu
  #Frame3D_1
  #Alles
  #Frame3D_3
  #Des
  #Check
  #Destruct
EndEnumeration


Global FontID7
FontID7 = LoadFont(7, "Franklin Gothic Demi Cond", 10)
Global FontID11
FontID11 = LoadFont(11, "Franklin Gothic Demi Cond", 14)

Procedure Open_Window_0()
If OpenWindow(#Window_0, 258, 10, 600, 512, "Destructer",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar )
  ExplorerTreeGadget(#Explorer, 20, 20, 180, 260, "")
  GadgetToolTip(#Explorer, "Ein Explorer zum auswählen der Dateien")
  SetGadgetFont(#Explorer, FontID7)
  Frame3DGadget(#Frame3D_0, 10, 0, 200, 290, "Datei auswählen")
  SetGadgetFont(#Frame3D_0, FontID7)
  ListIconGadget(#List, 220, 10, 370, 280, "Name", 150,#PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(#List, 1, "Pfad", 216)
  GadgetToolTip(#List, "Liste der Ausgewählten Dateien")
  SetGadgetFont(#List, FontID7)
  ProgressBarGadget(#Aktu, 20, 380, 560, 20, 0, 10, #PB_ProgressBar_Smooth)
  GadgetToolTip(#Aktu, "Fortschritt der aktuellen Datei")
  Frame3DGadget(#Frame3D_1, 10, 300, 580, 50, "Insgesamt")
  SetGadgetFont(#Frame3D_1, FontID7)
  ProgressBarGadget(#Alles, 20, 320, 560, 20, 0, 10, #PB_ProgressBar_Smooth)
  GadgetToolTip(#Alles, "Der Fortschritt aller Dateien")
  Frame3DGadget(#Frame3D_3, 10, 360, 580, 50, "Aktuelle Datei")
  SetGadgetFont(#Frame3D_3, FontID7)
  ComboBoxGadget(#Des, 20, 420, 180, 30)
  GadgetToolTip(#Des, "Art des Löschens")
  SetGadgetFont(#Des, FontID7)
  CheckBoxGadget(#Check, 370, 420, 150, 30, "Dateiname auch ändern")
  GadgetToolTip(#Check, "Dateiname auch ändern")
  SetGadgetFont(#Check, FontID7)
  ButtonGadget(#Destruct, 20, 460, 560, 40, "Destruct", #PB_Button_Default)
  GadgetToolTip(#Destruct, "Löscht alle Dateien unwiederbringlich")
  SetGadgetFont(#Destruct, FontID11)
  SetGadgetColor(#Aktu,#PB_Gadget_FrontColor,$000000)
  SetGadgetColor(#Alles,#PB_Gadget_FrontColor,$000000)
  AddGadgetItem(#Des,0,"Normal löschen")
  AddGadgetItem(#des,1,"Zero (1X)")
  AddGadgetItem(#des,2,"Einfach Random (1X Random)")
  AddGadgetItem(#des,3,"5X Random (5X Random)")
  AddGadgetItem(#des,4,"NATO-Standard (7X Random)")
  AddGadgetItem(#des,5,"Sicher (50X Random)")
  AddGadgetItem(#des,6,"Sicher ist Sicher (100x)")
  AddGadgetItem(#des,7,"Destructer (100X Random)")
  SetGadgetState(#des,4)
  CreatePopupMenu(0)
  MenuItem(0,"Entfernen")
  SetGadgetAttribute(#aktu,#PB_ProgressBar_Maximum,100)
  SetGadgetAttribute(#aktu,#PB_ProgressBar_Minimum,0)
EndIf
EndProcedure

Procedure.s Buchstabe()
Select Random(46)
Case 0
  ret.s = "a"
Case 1
  ret.s = "b"
Case 2
  ret.s = "c"
Case 3
  ret.s = "d"
Case 4
  ret.s = "e"
Case 5
  ret.s = "f"
Case 6
  ret.s = "g"
Case 7
  ret.s = "h"
Case 8
  ret.s = "i"
Case 9
  ret.s = "j"
Case 10
  ret.s = "k"
Case 11
  ret.s = "l"
Case 12
  ret.s = "m"
Case 13
  ret.s = "n"
Case 14
  ret.s = "o"
Case 15
  ret.s = "p"
Case 16
  ret.s = "q"
Case 17
  ret.s = "r"
Case 18
  ret.s = "s"
Case 19
  ret.s = "t"
Case 20
  ret.s = "u"
Case 21
  ret.s = "v"
Case 22
  ret.s = "w"
Case 23
  ret.s = "x"
Case 24
  ret.s = "y"
Case 25
  ret.s = "z"
Case 26
  ret.s = "1"
Case 27
  ret.s = "2"
Case 28
  ret.s = "3"
Case 29
  ret.s = "4"
Case 30
  ret.s = "5"
Case 31
  ret.s = "6"
Case 32
  ret.s = "7"
Case 33
  ret.s = "8"
Case 34
  ret.s = "9"
Case 35
  ret.s = "0"
Case 36
ret.s = "ß"
Case 37
ret.s = "´"
Case 38
ret.s = "+"
Case 39
ret.s = "#"
Case 40
ret.s = "-"
Case 42
ret.s = "."
Case 43
ret.s = ","
Case 44
ret.s = "<"
Case 45
ret.s = "^"
Case 46
ret.s = " "
EndSelect
If Random(1) = 1
  ret = UCase(ret)
EndIf
ProcedureReturn ret
EndProcedure

Procedure Destruct(file.s,Modus)
SetGadgetState(#aktu,0)
If Modus = 0
  If DeleteFile(file)
    SetGadgetState(#aktu,100)
  Else
    MessageRequester("Destructer","Die Datei " + file + "konnte nicht gelöscht werden.")
  EndIf
ElseIf Modus = 1
  SetGadgetState(#aktu,0)
  If OpenFile(0,file)
    Repeat
      string.s + ReadString(0)
    Until Eof(0) <> 0 
    SetGadgetState(#aktu,30)
    Len = Len(String)
    Repeat
      uber.s + "0"
    Until Len(uber.s) > Len
    SetGadgetState(#aktu,60)
    CloseFile(0)
    CreateFile(0,file)
    WriteStringN(0,uber)
    CloseFile(0)
    DeleteFile(file)
    SetGadgetState(#aktu,100)
  Else
    MessageRequester("Destructer","Die Datei " + file + "konnte nicht gelöscht werden.")
  EndIf
ElseIf Modus = 2
  SetGadgetState(#aktu,0)
  If OpenFile(0,file)
    Repeat
      string.s + ReadString(0)
    Until Eof(0) <> 0
    SetGadgetState(#aktu,30)
    Len = Len(string)
    Repeat
      uber + Buchstabe()
    Until Len(uber) > len
    SetGadgetState(#aktu,60)
    CloseFile(0)
    CreateFile(0,file)
    WriteStringN(0,uber)
    CloseFile(0)
    DeleteFile(file)
    SetGadgetState(#aktu,100)
  Else
    MessageRequester("Destructer","Die Datei " + file + "konnte nicht gelöscht werden.")
  EndIf
ElseIf Modus = 3
  SetGadgetState(#aktu,0)
  e = 0
  Repeat
    e + 20
    If OpenFile(0,file)
      Repeat
        string.s + ReadString(0)
      Until Eof(0) <> 0
      Len = Len(string)
      Repeat
        uber.s + Buchstabe()
      Until Len(uber) > len
      CloseFile(0)
      CreateFile(0,file)
      WriteStringN(0,uber)
      CloseFile(0)
      DeleteFile(file)
      SetGadgetState(#aktu,e)
    Else
    error = 1
    EndIf
  Until e = 100
  If error = 1
    MessageRequester("Destructer","Die Datei " + file + "konnte nicht gelöscht werden.")
    error = 0
  EndIf
ElseIf Modus = 4
  SetGadgetAttribute(#aktu,#PB_ProgressBar_Maximum,70)
  SetGadgetState(#aktu,0)
  e = 0
  Repeat
    e + 10
    If OpenFile(0,file)
      Repeat
        string.s + ReadString(0)
      Until Eof(0) <> 0
      Len = Len(string)
      Repeat
        uber.s + Buchstabe()
      Until Len(uber) > len
      CloseFile(0)
      CreateFile(0,file)
      WriteStringN(0,uber)
      CloseFile(0)
      DeleteFile(file)
      SetGadgetState(#aktu,e)
    Else
      error = 1
    EndIf
  Until e = 70
  If error = 1
    MessageRequester("Destructer","Die Datei " + file + "konnte nicht gelöscht werden.")
    error = 0
  EndIf
  SetGadgetAttribute(#aktu,#PB_ProgressBar_Maximum,100)
  SetGadgetState(#aktu,100)
EndIf
EndProcedure


open_window_0()

Repeat
  event = WaitWindowEvent()
  If event = #PB_Event_Gadget
    event = EventGadget()
    If event = #Destruct
      f = 0
      Moment = -1
      SetGadgetState(#aktu,0)
      SetGadgetState(#Alles,0)
      Repeat
        SetGadgetAttribute(#Alles,#PB_ProgressBar_Maximum,Eintrag)
        SetGadgetAttribute(#Alles,#PB_ProgressBar_Minimum,0)
        If Moment <= Eintrag
          Moment + 1
        Else
          f = 1
        EndIf
        SetGadgetItemState(#list,Moment,#PB_ListIcon_Selected)
        file.s = GetGadgetItemText(#list,moment)
        Debug file
        Destruct(file.s,GetGadgetState(#Des))
        SetGadgetState(#Alles,Moment)
      Until f = 1
      
    ElseIf event = #explorer
      event = EventType()
      If event = #PB_EventType_LeftDoubleClick
        If #PB_Explorer_File = GetGadgetState(#Explorer)
          n = 0
          For k = 0 To Eintrag
            If GetGadgetItemText(#list,k) = GetFilePart(GetGadgetText(#explorer))
              n = 1
            EndIf
          Next
          If n <> 1
            eintrag + 1
            AddGadgetItem(#List,Eintrag,GetGadgetText(#explorer))
          EndIf
        EndIf
      EndIf
    ElseIf event = #list
      If #PB_EventType_RightClick = EventType()
        DisplayPopupMenu(0,WindowID(0))
      EndIf
    EndIf
  ElseIf event = #PB_Event_Menu
    event = EventMenu()
    If event = 0
      If RemoveGadgetItem(#list,GetGadgetState(#list))
        eintrag - 1
      EndIf
    EndIf
  ElseIf event = #PB_Event_CloseWindow
    End
  EndIf
ForEver
Vielen Dank für eure Aufmerksamkeit.
Zuletzt geändert von Sauer-RAM am 13.01.2010 11:07, insgesamt 1-mal geändert.
"Bildung kommt vom Bildschirm und nicht vom Buch, sonst hieße es ja Buchung."
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Wo ist der Fehler?

Beitrag von NicTheQuick »

Mal abgesehen von deiner Frage, wollte ich dir noch sagen, dass einmal überschreiben schon ausreicht. Ich hab dazu schon ein paar Artikel gelesen. Darunter waren auch ein paar stochastische Überlegungen. Ich kann mich erinnern, dass die Wahrscheinlichkeit bei einer formatierten Festplatte wieder Daten zu finden, so gering war, dass du noch nicht mal ein Byte wieder herstellen kannst, sondern höchstens ein Bit oder zwei. Und das nach einmaligem Überschreiben.

Ich hab leider die Quelle nicht da und muss aus dem Kopf schreiben, aber vielleicht finde ich sie noch.
Benutzeravatar
Sauer-RAM
Beiträge: 326
Registriert: 13.04.2009 16:22
Computerausstattung: Lenovo ThinkPad X230t Convertible
Wohnort: Haslach i. K.

Re: Wo ist der Fehler?

Beitrag von Sauer-RAM »

Wisst ihr auch nicht? :cry:
"Bildung kommt vom Bildschirm und nicht vom Buch, sonst hieße es ja Buchung."
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Wo ist der Fehler?

Beitrag von Kiffi »

Sauer-RAM hat geschrieben:Wisst ihr auch nicht? :cry:
wahrscheinlich gehen die meisten davon aus, dass NicTheQuicks
Antwort Dich davon überzeugt hätte, dass solche Multi-Überschreib-
Tools nicht mehr zeitgemäß sind und Du deshalb Deinen Plan
aufgegeben hast.

Grüße ... Kiffi

P.S.: Ein sinnvoller Betreff wäre auch nicht übel. Du bist lange
genug dabei, so dass Du das eigentlich wissen solltest.
a²+b²=mc²
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Wo ist der Fehler?

Beitrag von WPö »

Dem stimme ich zu. Einmaliges Überschreiben ist genug. Wenn Du für Dich ein gutes Gefühl brauchst, von mir aus auch zweimal - mit $ff und $00. Anschließend kannste die Datei aus dem Verzeichnis löschen.

Zweimaliges Überschreiben wird erst dann sinnvoll, wenn Du verhindern möchtest, daß z.B. das BKA noch Daten extrahieren kann. Die machen das, indem sie die Stahlscheiben im Reinstraum ausbauen und mit eigenen Geräten im Rohformat auslesen. Der Schreibvorgang magnetisiert vielleicht nur zu 99%. War das Bit vor dem letzten Überschreiben 0, kommen 99% Magnetisierung heraus, war es 1, sind es 99,99%. Beim Löschen des Bits kommen 0,01% und 1% heraus. Die Genauigkeit ist begrenzt und deshalb zweimaliges Überschreiben sicher genug. Siehe auch Fachbegriff Remanenz.

So, in den Gadget-Definitionen hast Du mal #Des, mal #des stehen. Besser auf einen einheitlichen Stand bringen wie #DestrMode oder so. Insgesamt ist Dein Quelltext viel zu kompliziert. Du brauchst (wie gesagt) keine Zillionen Modi, wodurch auch die GUI einfacher wird. Die Dateien werden kpl. als Zeichenkette eingelesen, was unnötig ist. Was machst Du, wenn Du Filme löschen willst? Hast Du denn 700MB freies RAM? Definiere Dir einen Speicherblock mit z.B. 64kB Größe, den Du so oft in die Zieldatei schreibst, wie die Datei groß ist; den letzten Block natürlich in der Größe angepaßt. Die Zufallszahl-Routine kannste kpl. löschen.

Günstig wäre, vor Programmierbeginn erstmal eine Bedarfsanalyse zu machen. Da hättest Du gleich die richtigen Parameter erkannt.

Gruß - WPo
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Benutzeravatar
Sauer-RAM
Beiträge: 326
Registriert: 13.04.2009 16:22
Computerausstattung: Lenovo ThinkPad X230t Convertible
Wohnort: Haslach i. K.

Re: Wo ist der Fehler?

Beitrag von Sauer-RAM »

Mag sein, aber ich wüsste halt gerne wo da der Fehler ist. Ich will ja auch ein Musikabspielprogramm schreiben, das Die Musik in so einem Listgadget nacheinander abspielt. Aber wenn es mit löschen nicht klappt wie soll es denn dann mit abspielen gehen?
"Bildung kommt vom Bildschirm und nicht vom Buch, sonst hieße es ja Buchung."
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Wo ist der Fehler?

Beitrag von Kiffi »

@Sauer-RAM: Dein Code ist schon ziemlich wuselig.

Das sollte erst einmal helfen:

Code: Alles auswählen

[...]
    If event = #Destruct
      
      SetGadgetAttribute(#Alles, #PB_ProgressBar_Maximum, CountGadgetItems(#List) - 1)

      For FileCounter = 0 To CountGadgetItems(#List) - 1
        SetGadgetState(#Alles, FileCounter)
        Destruct(GetGadgetItemText(#List, FileCounter), GetGadgetState(#Des))
      Next

      ClearGadgetItems(#List) ; Liste leeren

      SetGadgetState(#Alles, 0) ; Progressbar wieder auf 0 setzen

    ElseIf event = #Explorer
[...]
Wenn Du wirklich daran interessiert bist, wie Du Deinen Code
sauberer gestalten kannst, dann melde Dich noch mal. Momentan
scheinen Dich ja ziemlich viele Ideen zu bewegen.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Sauer-RAM
Beiträge: 326
Registriert: 13.04.2009 16:22
Computerausstattung: Lenovo ThinkPad X230t Convertible
Wohnort: Haslach i. K.

Re: Wo ist der Fehler? [Gelöst]

Beitrag von Sauer-RAM »

Ok Danke Kiffi.
"Bildung kommt vom Bildschirm und nicht vom Buch, sonst hieße es ja Buchung."
Dieter Hildebrandt
"Bildung ist Das, was übrig bleibt, wenn man alles was man in der Schule gelernt hat, vergisst. "
Albert Einstein
Antworten