![]() |
Dateien ohne Inhalt (leere Dateien) finden
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe ein Problem mit meinem Fileserver und hoffe zunächst, die richtige Rubrik innerhalb der :dp: 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:
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:
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
Delphi-Quellcode:
Kann mir jemand helfen, meine Denkblockade aufzulösen?
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; Danke, Alex |
AW: Dateien ohne Inhalt (leere Dateien) finden
Genauere Fehlermeldung?
Verrate mir übrigens bitte wie groß die größte Datei ist Edit1:
Delphi-Quellcode:
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.
BlockRead(F, Buffer, BuffSize, Res); // #1
{...} For I:=1 To Res Do // #2 Begin If (Buffer[I] <> 0) Then // #2 {...} Probier mal
Delphi-Quellcode:
Edit2 Anmerkung nebenbei:
//..
BlockRead(F, Buffer[1], BuffSize, Res) Du kannst übrigens die Schleife schon vorzeitig verlassen und zwar genau dann, wenn diese if Bedingung zutrifft (verwende break dazu...)! |
AW: Dateien ohne Inhalt (leere Dateien) finden
Ist eigentlich ungewöhnlich einen Buffer nicht mit index-0 staten zu lassen (
Delphi-Quellcode:
)
for i:=0 to res-1...
Gruß K-H |
AW: Dateien ohne Inhalt (leere Dateien) finden
[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) |
AW: Dateien ohne Inhalt (leere Dateien) finden
Danke für Eure Antworten!
Ich bekomme eine EAccessViolation in der Zeile mit
Delphi-Quellcode:
. Nicht mehr und nicht weniger. Warum ist mir völlig unklar. Dabei sieht die Deklaration wie folgt aus:
If (Buffer[I] <> 0) Then
Delphi-Quellcode:
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...
Const
BuffSize = 1024; Var SR : TSearchRec; F : File; Buffer : Array [1..BuffSize] Of Byte; Res : Integer; IsEmpty : Boolean; I : Integer; 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
Delphi-Quellcode:
steht ja schon auskommentiert da 8-)
break
Warum ich bei 1 und nicht bei 0 mit dem Index angefangen habe, weiß ich auch nicht. Ich habe jetzt
[edit] Falls jemand eine leere Datei zum Testen braucht, kann ich die liefern. Gepackt dürfte die ja nicht sehr groß sein ;-) [/edit] |
AW: Dateien ohne Inhalt (leere Dateien) finden
Je nachdem was Buffer ist...
Schreibst Du nicht ins Array sondern an die Adresse der Array Variable... daher immer Buffer[0] verwenden... Mavarik |
AW: Dateien ohne Inhalt (leere Dateien) finden
Ich bin ein Stück weiter. Den Verursacher habe ich gefunden, nicht aber die Ursache. Der Code sieht modifiziert wie folgt aus:
Delphi-Quellcode:
Das für mich verblüffende ist die Meldung
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.'); ...
Code:
Die Datei ist natürlich keine 4 MB groß. Wieso liefert mir BlockRead einen falschen Wert zurück?
Urlaub.xls
Es wurden 4.469.406 Bytes gelesen. |
AW: Dateien ohne Inhalt (leere Dateien) finden
:dancer: ich habe den Fehler(?) soeben selbst gefunden!
Ich habe
Delphi-Quellcode:
in
Reset(F);
Delphi-Quellcode:
geändert. Jetzt hat
Reset(F, 1);
Delphi-Quellcode:
die richtige Größe und meine Schleife rennt nicht mehr über das Ende hinaus.
Res
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! |
AW: Dateien ohne Inhalt (leere Dateien) finden
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 (
Delphi-Quellcode:
) wird die Größe des Typs als RecSize verwendet.
var F: File of Byte;
[add] PS: Du wirst es nicht glauben, aber das steht sogar in der OH (falls man diese lesen würde) Zitat:
|
AW: Dateien ohne Inhalt (leere Dateien) finden
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz