AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien ohne Inhalt (leere Dateien) finden

Ein Thema von Schwedenbitter · begonnen am 10. Sep 2012 · letzter Beitrag vom 11. Sep 2012
Antwort Antwort
Seite 1 von 2  1 2      
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 14:19
Hallo,
ich habe ein Problem mit meinem Fileserver und hoffe zunächst, die richtige Rubrik innerhalb der gefunden zu haben.

Nach einem Absturz (Ursache ist hier egal), habe ich jetzt schon ein paar Dateien gefunden, deren Größe <> 0 Bytes ist, deren Inhalt aber wie folgt aussieht:
Code:
00000000   00 00 00 00   00 00 00 00   00 00 00 00   00 00 00 00
00000010   00 00 00 00   00 00 00 00   00 00 00 00   00 00 00 00
00000020   00 00 00 00   00 00 00 00   00 00 00 00   00 00 00 00
Das sollte so nicht sein und ich befürchte, dass es noch ein paar weitere Dateien "erwischt" hat. Ich habe jetzt in meiner Not quick and dirty etwas zusammenprogrammiert, was mir derartige Null-Dateien rekursiv suchen soll, was aber nicht funktioniert. Den vollständigen Code habe ich angehängt. Der Fehler muss aber irgendwo hier liegen:
Delphi-Quellcode:
If (SR.Size > 0) Then                  // 0-Byte-Dateien ignorieren
Begin
   AssignFile(F, Dir + PathDelim + SR.Name);
   System.FileMode:=fmOpenRead;
   {$I-}
   Reset(F);
   If (IOResult = 0) Then
   Begin
      IsEmpty:=True;
      BlockRead(F, Buffer, BuffSize, Res);
      CloseFile(F);
      If (Res > 0) Then
      Begin
         For I:=1 To Res Do
         Begin
            If (Buffer[I] <> 0) Then
            Begin
               IsEmpty:=False;
// Break;
            End;
         End;
      End;
      If IsEmpty Then
         LBFiles.Items.Append(Dir + PathDelim + SR.Name + ' - (' +
         FormatFloat('0,', SR.Size) + ')');
   End;
   {$I+}
End;
Kann mir jemand helfen, meine Denkblockade aufzulösen?

Danke, Alex
Angehängte Dateien
Dateityp: zip EmptyFiles_p.zip (2,1 KB, 4x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 14:24
Genauere Fehlermeldung?

Verrate mir übrigens bitte wie groß die größte Datei ist

Edit1:
Delphi-Quellcode:
  BlockRead(F, Buffer, BuffSize, Res); // #1
  {...}
  For I:=1 To Res Do // #2
  Begin
    If (Buffer[I] <> 0) Then // #2
  {...}
Ich nehme an, dass dein Buffer nicht 0 indiziert ist (= 1 bis n); folglich darfst du bei #1 doch nicht Buffer so alleine angeben, wenn ich mich richtig erinnere.
Probier mal
Delphi-Quellcode:
//..
  BlockRead(F, Buffer[1], BuffSize, Res)
Edit2 Anmerkung nebenbei:
Du kannst übrigens die Schleife schon vorzeitig verlassen und zwar genau dann, wenn diese if Bedingung zutrifft (verwende break dazu...)!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (10. Sep 2012 um 14:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 14:43
Ist eigentlich ungewöhnlich einen Buffer nicht mit index-0 staten zu lassen (for i:=0 to res-1... )

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 14:55
[edit]
Wollte ich vorhin auch schon fragen.

Was ist "Buffer" ?
Und sicher daß es von 1..Länge geht?

Joar, Fehlerbeschreibungen braucht man ja nicht zu nennen ... jedenfalls nicht, wenn man von uns keine schnelle "hilfreiche" Antwort haben möchte und nee, wir haben niocht immer die Lust/Zeit/Möglichkeit es erst selber auszuprobieren.
Tipp: Strg+C funktioniert fast überall. (auch in Dialogen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Sep 2012 um 14:58 Uhr)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 15:03
Danke für Eure Antworten!

Ich bekomme eine EAccessViolation in der Zeile mit If (Buffer[I] <> 0) Then . Nicht mehr und nicht weniger. Warum ist mir völlig unklar. Dabei sieht die Deklaration wie folgt aus:
Delphi-Quellcode:
Const
   BuffSize      = 1024;
Var
   SR            : TSearchRec;
   F            : File;
   Buffer      : Array [1..BuffSize] Of Byte;
   Res         : Integer;
   IsEmpty      : Boolean;
   I            : Integer;
Aber das wollte ich nicht alles hier schreiben. Deshalb hatte ich ja den Quellcode gepackt angefügt. Was genau - zusätzlich zur Fehlermeldung - braucht Ihr noch für eine schnelle Antwort. Ich bin ja durchaus willig...

Die größte Datei ist bislang ca. 1,5 MB. Üblicher Weise beginnen Dateien nicht eben mal mit Nullen. I.d.R. steht am Anfang ein TAG, der die Datei einem bestimmten Typ zuordnet, bei exe-Dateien steht am Anfang 'MZ' etc.
Mir reicht es bei meiner Suche, wenn ich feststelle, dass die ersten 1024 Bytes (oder weniger) ausschließlich Nullen sind. Dann kann ich per Hand nachsehen. Denn nachsehen und die Dateien mit sinvollen Daten aus dem Backup ersetzen muss ich sowieso. Und weil es um ca. 200 GB an Daten geht, kann/will ich die Dateien nicht komplett auslesen.

Die Schleife werde ich später vorzeitig beenden. Das break steht ja schon auskommentiert da

Warum ich bei 1 und nicht bei 0 mit dem Index angefangen habe, weiß ich auch nicht.

Ich habe jetzt
  • das Array von 0 bis 1023 definiert,
  • habe bei BlockRead Buffer[0] angegeben und
  • lasse die Schleife von 0 bis Pred(Res) laufen
und bekomme trotzdem noch die EAccessViolation.

[edit]
Falls jemand eine leere Datei zum Testen braucht, kann ich die liefern. Gepackt dürfte die ja nicht sehr groß sein
[/edit]
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 15:07
Je nachdem was Buffer ist...

Schreibst Du nicht ins Array sondern an die Adresse der Array Variable...

daher immer Buffer[0] verwenden...

Mavarik
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 15:18
Ich bin ein Stück weiter. Den Verursacher habe ich gefunden, nicht aber die Ursache. Der Code sieht modifiziert wie folgt aus:
Delphi-Quellcode:
BlockRead(F, Buffer[0], SizeOf(Buffer), Res);
CloseFile(F);
If (Res > 0) Then
Begin
   ShowMessage(SR.Name + #13 + 'Es wurden ' + FormatFloat('0,', Res) + ' Bytes gelesen.');
   ...
Das für mich verblüffende ist die Meldung
Code:
Urlaub.xls
Es wurden 4.469.406 Bytes gelesen.
Die Datei ist natürlich keine 4 MB groß. Wieso liefert mir BlockRead einen falschen Wert zurück?
Alex Winzer
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 15:25
ich habe den Fehler(?) soeben selbst gefunden!

Ich habe Reset(F); in Reset(F, 1); geändert. Jetzt hat Res die richtige Größe und meine Schleife rennt nicht mehr über das Ende hinaus.
Ich frage mich trotzdem, warum das so fatal ist. Lt. Hilfe wird ohne Angabe eine Blockgröße von 128 verwendet. Aber selbst wenn, dann wären 128 x 1024 lediglich 131.072 und nicht ca. 4 Mio...

Danke für Eure Hilfe!
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#9

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 15:50
Ich würde dir einfach mal empfehlen, dich mit Streams zu beschäftigen.

Nja, wenn keine RecSize angegeben ist, dann wird 128 verwendet. (das ist die Größe des Standard-Puffers, welcher für diese alten Dateiopertionen verwendet wird).
Bei typisierten Dateien (var F: File of Byte; ) wird die Größe des Typs als RecSize verwendet.

[add]
PS: Du wirst es nicht glauben, aber das steht sogar in der OH (falls man diese lesen würde)
Zitat:
RecSize ist ein optionaler Ausdruck, der nur bei untypisierten Dateien angegeben werden kann. Wenn F eine untypisierte Datei ist, gibt RecSize die Blockgröße für Datenübertragungen an. Wenn Sie RecSize nicht angeben, wird der Standardwert 128 verwendet.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Sep 2012 um 15:56 Uhr)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 15:58
Ich würde dir einfach mal empfehlen, dich mit Streams zu beschäftigen.
Das habe ich schon - in anderen Projekten. Ich schrieb ja nicht umsonst in meinem ersten Beitrag quick and dirty. Ich habe in Anbetracht der sich zerlegenden HDD meines Servers im Moment leider andere Probleme als schicken Code mit TFileStream & Co. zu erstellen.

...
Bei typisierten Dateien (var F: File of Byte; ) wird die Größe des Typs als RecSize verwendet.
Alles klar. Dann verstehe ich auch, warum meine anderen Codes mit BlockRead nie Probleme machten. Dort hatte ich - per Zufall also - immer typisierte Dateivariablen deklariert. Danke für die Erklärung.
Alex Winzer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz