Seite 1 von 2

Kann Fehler nicht finden...

Verfasst: 30.09.2008 22:30
von DrNo
Hallo wieder,
Sorry dass ich mich schonwieder melden muss, muss aber ich bin grad voll am Ende...(Brain.exe - Keine Rückmeldung; Brain.exe hat einen Fehler festgestellt und musste beendet werden...)
Ich hab mir einen Nachfolger des Shredders den ich hier schonmal gepostet habe gemacht. Funktioniert nach dem gleichen Löschprinzip, nur mit mehrfachselektion (NextSelectedFileName()) und neuen Funktionen.
Nun ist es aber so, dass das Programm den eigentlichen Löschvorgang immer überspringt und manchmal sogar beim auswählen der Dateien einfach Abstürzt. Und ich weis einfach nicht woran das liegt!

Ich poste hier erstmal nur den Löschcode um nicht gleich für Verwirrung zu Sorgen. Falls ihr mir nicht helfen könnt poste ich den ganzen...
If Event = #PB_Event_Gadget
If EventGadget() = 7
wdh = GetGadgetState(4)
c = 0
AddGadgetItem(3, -1, "Löschvorgang von "+Str(count)+" Datei/en mit "+Str(Anzahl)+"-facher Wiederholung gestartet...") ; Info-Anzeige im EditorGadget
DisableGadget(7, 1)
While FileName$ ; Beginn der NextSelectedFileName()-Schleife
If ReadFile(0, FileName$)
length = Lof(0)
*MemoryID = AllocateMemory(length)
If *MemoryID
bytes = ReadData(0, *MemoryID, length) ; Ermitteln der größe der aktuellen Datei zur Anzeige und zum Überschreibungs-stopper.
EndIf
CloseFile(0)
EndIf
AddGadgetItem(3, -1, "Lösche Datei "+Str(c)+" von "+Str(count)+" ("+Str(bytes)+") bytes...") ; Anzeige zum start des eigentlichen Löschvorgangs im E.-Gadget.
If OpenFile(0, FileName$)
For b = 0 To wdh Step 1 ; Löschvorgang so oft wie im TrackBarGadget angegeben wiederholen.
For a = 0 To bytes Step 2 ; Sooft überschreiben bis ursprüngliche Dateigröße wieder erreicht.
WriteWord(0, Random($FFFF))
FlushFileBuffers(0)
Next
FlushFileBuffers(0)
CloseFile(0)
Next
Else
AddGadgetItem(3, -1, "ERROR: Es ist ein Fehler aufgetreten.")
EndIf
c + 1 ; zur Anzeige: c von x Dateien gelöscht
AddGadgetItem(3, -1, "Datei gelöscht!")
FileName$ = NextSelectedFileName() ; Nächste Datei
Wend
AddGadgetItem(3, -1, "Alle Dateien erfolgreich gelöscht!")
ClearGadgetItemList(0) ; Fertigstellung des Löschvorgangs und freigeben der Lösch funktion.
DisableMenuItem(0, 1, 0)
DisableGadget(7, 0)
EndIf
EndIf
Um euch das zu erleichtern hab ich die ;-Hilfen Fett markiert, was aber nur im Zitat geht und er da die Formatierung verliert. Deswegen hier nochmal ohne ;-Hilfe:

Code: Alles auswählen

If Event = #PB_Event_Gadget
       If EventGadget() = 7
          wdh = GetGadgetState(4)
          c = 0
          AddGadgetItem(3, -1, "Löschvorgang von "+Str(count)+" Datei/en mit "+Str(Anzahl)+"-facher Wiederholung gestartet...")
          DisableGadget(7, 1)
         While FileName$
             If ReadFile(0, FileName$) 
                length = Lof(0)                           
                *MemoryID = AllocateMemory(length)         
               If *MemoryID
                  bytes = ReadData(0, *MemoryID, length)
               EndIf
               CloseFile(0)
             EndIf
             AddGadgetItem(3, -1, "Lösche Datei "+Str(c)+" von "+Str(count)+" ("+Str(bytes)+") bytes...")  
             If OpenFile(0, FileName$)
               For b = 0 To wdh Step 1
                 For a = 0 To bytes Step 2
                    WriteWord(0, Random($FFFF))
                    FlushFileBuffers(0)
                 Next
                  FlushFileBuffers(0) 
                  CloseFile(0)
               Next
              Else
               AddGadgetItem(3, -1, "ERROR: Es ist ein Fehler aufgetreten.")
             EndIf
             c + 1
             AddGadgetItem(3, -1, "Datei gelöscht!") 
            FileName$ = NextSelectedFileName() 
          Wend
           AddGadgetItem(3, -1, "Alle Dateien erfolgreich gelöscht!")
           ClearGadgetItemList(0)
           DisableMenuItem(0, 1, 0)
           DisableGadget(7, 0) 
      EndIf
       EndIf  
Sieht dann ungefähr so aus:
Bild

Ich hoffe ihr könnt mir helfen!

grüße DrNo

Verfasst: 30.09.2008 22:47
von Deluxe0321

Code: Alles auswählen

             If ReadFile(0, FileName$)
                length = Lof(0)                           
                *MemoryID = AllocateMemory(length)         
               If *MemoryID
                  bytes = ReadData(0, *MemoryID, length)
               EndIf
               CloseFile(0)
             EndIf 
kannst du durch:
bytes=FileSize(FileName$) ersetzten, damit behebst du z.b diesen Fehler:
Du allokierst Speicher aber gibst ihn am Ende nicht frei. (FreeMemory())
*MemoryID = AllocateMemory(length)


Und dein hauptproblem lag wohl hier..

Code: Alles auswählen

If OpenFile(0, FileName$)
               For b = 0 To wdh Step 1
                 For a = 0 To bytes Step 2
                    WriteWord(0, Random($FFFF))
                    FlushFileBuffers(0)
                 Next
                  FlushFileBuffers(0)
                Next
             CloseFile(0) ;<-- Warum schließt du die datei immer in der Next schleife? ;)
            else[...] 

Verfasst: 30.09.2008 23:16
von DrNo
Dank für die schnelle Antwort und die Tipps,
Das mit FileSize hatte ich ganz übersehen!

Und bei deinem Ausschnitt ist absichtlich CloseFile() drin, weil 1.) wir davon ausgehen, dass es mehrere Dateien sind und 2.) weil normalerweise die Datei (hier noch nicht drin) danna uch gelöscht wird - in deisem fall nach Closefile. Closefile muss meines wissens sowieso da stehen, weil dass das Ende der Überschreib-Wiederholungsschleife ist und nach abschluss dann dei nächste (wenn wir mehrere Dateien haben) geöffnet wird.

Leider hat sich das Problem nicht beheben lassen...

Zum Löschverfahren: baut auf meinem alten Shredder auf: http://www.purebasic.fr/german/viewtopi ... rschreiben (Seite 3) Es unterscheided sich nur dadurch, dass ich die a etc variablen beim löschen durch For...Next Schleifen ersetzt habe. Vielleicht liegt es ja auch nur genau daran, aber ich ich...ähh.. ja keine AHnung :freak:

Verfasst: 01.10.2008 01:46
von Deluxe0321
entweder ich bin verstrahlt, oder ich verstehe deinen Sinn darin nicht.
Du öffnest die Datei ein mal und lässt sie dann wdh mal schließen? Wie soll das funktionieren?

Also, so wie ich mir jetzt den anderen Code angesehen habe, musst du OpenFile() nach For b = 0 To wdh Step 1 einfügen, nicht davor!
Dann passt das ganze wieder; wdh mal öffnen und schließen..
Sonst sehe ich darin keinen Sinn.

Gruß Marvin

Verfasst: 01.10.2008 18:08
von DrNo
Hallo, ich weis zwar nicht ob es daran liegt aber hier nochmal zur verdeutlichung der 3 Schleifen im Löschvorgang:

Code: Alles auswählen

Schleife 1 - NextselectedFileName()-Schleife, damit alle gewählten Dateien gelöscht werden (multiselection).
      Schleife 2 - Wiederholt das überschreiben der Datei so oft wie im TrackBarGadget gewählt. 
            Schleife 3 - Überschreibungsschleife: Überschreibt die Datei solang mit einem zufälligen String (2 bytes),                           bis die Datei ihren ursprünglichen Wert wieder erreicht hat (vollständig überschrieben).
            Schleife 3 Ende
      Schleife 2 Ende
Schleife 1 Ende
Alles For...Next Schleifen. Im Prinzip kann es nur an ihnen liegen, weil davor hab ich es mit Repeat Schleifen gemacht einfach mit Until x = y und da hats ja noch geklappt.
Aber vielelicht fällt euch noch was auf.

grüße DrNo

Verfasst: 01.10.2008 18:36
von Kaeru Gaman
Delüx hat recht:

Code: Alles auswählen

             If OpenFile(0, FileName$)
               For b = 0 To wdh Step 1
                 For a = 0 To bytes Step 2
                    WriteWord(0, Random($FFFF))
                    FlushFileBuffers(0)
                 Next
                  FlushFileBuffers(0)
                  CloseFile(0)  <-- ***
               Next            <-- ***
              Else
das ist direkt aus deinem Code kopiert.
du musst also entweder die beiden markierten zeilen vertauschen UND vor die innerste Schleife ein FileSeek(0,0) einsetzen,
oder du packst das OpenFile innerhalb der "b To wdh"-Schleife.

außerdem musst du beachten, dass For/Next Schleifen nur mit Long funktionieren, Dateien können aber größer sein, bei FileSeek kannst du ne Quad als Position angeben.

Verfasst: 01.10.2008 20:32
von DrNo
Hallo,
Hm...ich hab beide Möglichkeiten ausprobiert, aber es klappt trozdem nicht. Die übersdhreib + löschvorgänge werden übersprüngen, Sprich: Nachdem ich auf löschen geklickt hab steht dann direkt dass er fertig sei:
Überprüfe Installation...
Version 1.0 Release 30.09.08
Shredder 2 erfolreich gestartet!

7 Datei/en zum Löschen ausgewählt.
Löschvorgang von 7 Datei/en mit 100-facher Wiederholung gestartet...
Alle Dateien erfolgreich gelöscht!
Wiegesagt, normalerweise sollte vor der totalen Fertigstellung zu Jeder Datei (lösche...) eine Info kommen, was ja auch eingebaut ist. Diese werden nicht angezeigt und deswegen denke ich dass alles übersprungen wurde.

Ich habe den alten code mal zum test komplett reingebaut und der hat dann genau das gleiche geliefert. Es könnte also was mit der NextSelectedFileName() Schleife zu tun haben. Aber keine Ahnung was. /:->

außerdem musst du beachten, dass For/Next Schleifen nur mit Long funktionieren, Dateien können aber größer sein, bei FileSeek kannst du ne Quad als Position angeben.
Wie meinst du das, dass ich dann aus Variable n long (x.l) machn soll?
Und wie meinst du das mit größer sein?

Verfasst: 01.10.2008 20:48
von Kaeru Gaman
damit meine ich, dass deine Schleifenvariablen Longs sein müssen, damit die For-schleife richtig funktioniert.
das sind sie auch automatisch (bis PB4.2), wenn du keinen Typ angibst.

das bedeutet aber gleichzeitig, dass deine schleife maximal bis 2.147.483.647 laufen kann.
wenn deine Datei größer ist (als 2048MB), kannst du sie nicht mit einer For-schleife durchgehen.
FileSize liefert dir eine Quad zurück, kann also größere Dateien korrekt rückmelden.


Edith
> Die übersdhreib + löschvorgänge werden übersprüngen, Sprich: Nachdem ich auf löschen geklickt hab steht dann direkt dass er fertig sei:
bist du sicher, dass sie übersprungen werden, und nicht nur irre schnell fertig sind?

Verfasst: 01.10.2008 21:35
von DrNo
Nein, denn auch wnn es in sekundenbruchteilen geschehen sollte, angezeigt wird trozdem, dass die Dateien gelöscht wurden.
Siehe Code. Auserdem sind sie ja garnicht gelöscht, geschweige denn überschrieben worden. (ich kann sie ja noch öffnen). Wennschon, wäre es seehr unwarscheinlich da es bei mir ca. 3-5 sekunden dauert eine 1mb größe datei mit 100facher wiederholung zu löschen.

Echt seltsam, warum das nicht klappt.

Ich könnte dir (Kaeru_Gaman) mal die save datei schicken (oder über meine webspace für dich hochladen), vielleicht kommst du dann bessser zurecht/findest den Fehler. Ich bin nämlich ratlos :(

Verfasst: 01.10.2008 22:45
von Kaeru Gaman
> Ich könnte dir (Kaeru_Gaman) mal die save datei schicken (oder über meine webspace für dich hochladen), vielleicht kommst du dann bessser zurecht/findest den Fehler.

kostet 160,-€ die Stunde, und ich brauche mindestens drei Stunden, hast du so viel übrig?



also, du solltest vielleicht erstmal posten, wie die routine jetzt aussieht nachdem du sie verbessert hast.
dann solltest du vielleicht noch ein paar debugs einbaun, um zu überprüfen,
ob deine routine überhaupt das ausführt was sie soll.

zum beispiel wird ja wohl dein text "Datei gelöscht!" garnicht ausgegeben,
also scheint er die While-Schleife garnicht zu durchlaufen,
also scheint wohl FileName$ garnicht zu existieren,

was mich jetzt auch garnicht mehr wundert, wo setzt du den eigentlich?
am ende der schleife, schön, aber VOR der schleife musst du den
auch schon mal setzen, damit die überhaupt anspringt.

das ist mir jetzt grade aufgefallen, während ich das posting schreibe.

das wäre dir auch aufgefallen, wenn du drauf geachtet hättest, dass ein
teil deiner normalen ausgabe fehlt, und noch mehr wäre dir das aufgefallen,
wenn du ein paar zusätzliche debugs zur kontrolle reingehaun hättest.

dazu kommt, dass dein programm ja am anfang grundweg falsch war,
das close in der falschen schleife bzw. das open draußen, wie Delüx ja dargelegt hat,
und noch dazu deine unmögliche umständliche methode um die länge zu ermitteln...

also bitte etwas mehr konzentration und eigeninitiative bevor man weinend ins forum gerannt kommt....

sorry, ich weiß das ist hier der Anfänger-Bereich, und ich weiß auch,
dass ich nicht immer schreiben sollte, was ich denke...