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
Benutzerbild von Mavarik
Mavarik

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

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 14: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
 
#2

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 14: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
 
#3

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 14: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

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

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 14: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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Sep 2012 um 14:56 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, 14: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
Benutzerbild von himitsu
himitsu

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

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 15:11
Joar, ich kenn das.
Hatte vor Jahren mal beim Backup probleme bekommen, wo es mir auch noch die Backupplate zerschoß.

Bei der Datenwiederherstellung und vorallem nach Checkdisk waren dann plötzlich viele Dateien 0 Byte groß und oftmals waren ganze Dateien oder nur einer/mehrere Cluster innerhalb von Dateien mit 0 gefüllt.
Hatte mir da auch ein suchprogrämmchen geschrieben, aber ich glaub das Progrämmchen hab'sch inzwischen gelöscht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 15:15
Delphi-Quellcode:
implementation
{$R *.dfm}

type
 TBuff=Array[0..1023] of Byte;
var
 EmptyBuff:TBuff;

procedure TForm6.Button2Click(Sender: TObject);
var
 fs:TFileStream;
begin
   fs:=TFileStream.Create('C:\temp\log.txt',fmCreate);
   fs.Write(EmptyBuff[0],200);
   fs.Free;
end;

procedure TForm6.FormCreate(Sender: TObject);
begin
  ZeroMemory(@EmptyBuff[0],1023)
end;

Function FileIsEmpty(fn:String):Boolean;
var
 fs:TFileStream;
 Buff:TBuff;
 read:Integer;
 i:Integer;
begin
  ZeroMemory(@Buff[0],1023);
  fs:=TFileStream.Create(fn, fmOpenread);
  try
  read := fs.Read(Buff[0],1024);
  Result := true;
  for I := 0 to read-1 do Result := Result and (EmptyBuff[i]= Buff[i]);

  finally
    fs.Free;
  end;
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  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, 16:27
Joar, ich kenn das.
Hatte vor Jahren mal beim Backup probleme bekommen, wo es mir auch noch die Backupplate zerschoß.

Bei der Datenwiederherstellung und vorallem nach Checkdisk waren dann plötzlich viele Dateien 0 Byte groß und oftmals waren ganze Dateien oder nur einer/mehrere Cluster innerhalb von Dateien mit 0 gefüllt.
Hatte mir da auch ein suchprogrämmchen geschrieben, aber ich glaub das Progrämmchen hab'sch inzwischen gelöscht.
Dann muss ich doch mal ausholen:

Mein Fileserver basiert auf openSUSE 11.4 mit Samba. Das Filesystem ist laut fsck in Ordnung. Die Dateien sind bemerkenswerter Weise auf nicht 0 Bytes groß. Dass wäre unter Linux ohne Verrenkungen ein Einzeiler mit dem schönen Befehlt grep.

Nach dem Crash haben die Dateien dieselbe Größe. Nur eben alles voller sinnloser Nullen. Den Code muss ich noch etwas ändern. Ich habe gerade festgestellt, dass iso-Dateien am Anfang auch "leer" sind und erst nach ca. 32KB etwas sinnvolles kommt. Ich habe daher meinen Puffer mal sicherheitshalber auf 524288 Bytes erhöht. Das kostet nicht soviel Zeit, macht aber die Ergebnisse sicherer.

Die ersten Durchläufe sind Dank Eurer Hilfe schon erledigt. Ich weiß jetzt, dass ich eine Menge Datenmüll habe. Glücklicherweise hat aber mein Backup-Server das getan, was er tun soll, nämlich die laufenden Daten zu sichern. Dass mein wöchentliches Backup Schrott ist, kann ich damit verkraften. Zudem ist der Crash am Wochenende passiert, so dass nicht soviel Daten betroffen sind. Arbeit macht es trotzdem.

Soll ich das fertige Produkt nochmal hochladen, für den Fall, dass eines fernen Tages jemand dasselbe Problem hat?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 10. Sep 2012, 15:18
Soo groß ist der Unterschied zwischen TFileStream und Blockwrite ja nun auch nicht:
Delphi-Quellcode:
const
  maxbuffsize=1024;
var
  buffer : array [0..maxbufsize-1];
  f : file;


assignfile(f,'Myfile');
reset(f,1);
repeat
  readed:=blockread(f,buffer,maxbuffsize); {bei nicht dyn arrays geht das! }
  if readed>0 then machwasdamit;
until readed<maxbufsizes;
closefile(f);
Delphi-Quellcode:
const
  maxbuffsize=1024;
var
  buffer : array [0..maxbufsize-1];
  f : tfilestream;

f:=tfilestream.Create('Myfile',fmopenread or fmsharedenynone);
repeat
  readed:=f.read(buffer,maxbuffsize); {bei nicht dyn arrays geht das! }
  if readed>0 then machwasdamit;
until readed<maxbufsizes;
f.free;
Ich hab auch lange einen Bogen darum gemacht.

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

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

AW: Dateien ohne Inhalt (leere Dateien) finden

  Alt 11. Sep 2012, 12:14
Soo groß ist der Unterschied zwischen TFileStream und Blockwrite ja nun auch nicht:
Gruß
K-H
Unterschied? Beide Aufrufe laufen doch sowieso über die gleiche Kernel32 FileIO Routinen. Ich Denke, wenn ich mir den ASM Code anschaue ist die Blockread Variante noch etwas kürzer...

Mavarik
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:03 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-2025 by Thomas Breitkreuz