AGB  ·  Datenschutz  ·  Impressum  







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

Dateien zerlegen und zusammenfügen

Ein Thema von bscreator · begonnen am 14. Apr 2006 · letzter Beitrag vom 17. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
bscreator

Registriert seit: 20. Jan 2005
Ort: Kempten
15 Beiträge
 
#1

Dateien zerlegen und zusammenfügen

  Alt 14. Apr 2006, 22:58
Liebe Delphi-Fans,
habe folgendes Problem:

Mein aktuelles Projekt ist eine Software, die große Dateien in mehrere kleine Dateien zerlegen und auch wieder zu einer Datei zusammenfügen kann (Ja, ich weiß, das Rad immer wieder neu erfinden..., aber da ich schon seit längerer Zeit nicht mehr Delphi programmiert hab, muss ich wieder reinkommen).
Soviel zum Prolog...

In meinem Delphi 4 - Buch stehen ein paar Dinge, aber nichts richtig konkretes.

Problem 1:

Die Software soll möglichst wenig Arbeitsspeicher verwenden (auch wenns dadurch vielleicht bisl länger dauert...), das ist eigentlich die Vorraussetzung. Welche Methode würdet ihr da empfehlen ? (mit Streams, Memory Mapped Files, oder sonst was ?)



Problem 2:
Ein Stück quellcode liegt bei. Der Code zählt die Anzahl der Datensätze einer Datei:
Delphi-Quellcode:
    Exists := false;
    Pos := 0;

    if (FileExists(Edit1.Text)) =true then
    begin
        Res:=DisableWriteProtection(Edit1.Text); //Schreibschutz aufheben
[b] Edit4.Text := 'Waiting...';[/b]
        
        try //Anzahl der Datensätze ermitteln

          AssignFile(F, Edit1.Text); //Dateipointer zuweisen
          Reset(F); //Datei öffnen
          
          Seek(F,0); //Satzzeiger an Anfang

          While (EOF(F)) = false do
          begin
              Pos := Pos+1;
              Seek(F, Pos);
          end;

          Edit4.Text := IntToStr(Pos);
        finally
           CloseFile(F);
        end;
Der Code funktioniert, auch die Anzahl der Datensätze werden korrekt zurückgegeben. Da der Benutzer aber nicht denken, soll, dass sich der Computer aufgehängt hat, soll im Edit4-Feld vor dem Beginn der while-Schleife ein 'Waiting' angezeigt werden. Nach Durchlauf der While-Schleife wird das 'Waiting' durch die Anzahl der Datensätze ersetzt.
Seltsamerweise wird im Edit4-Feld aber kein 'Waiting...' angezeigt, sondern nur die Anzahl der Datensätze, wenn die while-Schleife beendet ist. Hab schon versucht, den Befehl "Edit4.Text := 'Waiting'" an eine andere Stelle innerhalb des try-finally-Blocks zu setzen, aber auch das geht nicht. Was ist da los ?

Vielen, vielen Dank
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Dateien zerlegen und zusammenfügen

  Alt 14. Apr 2006, 23:02
Mach mal ein Edit4.Refresh. Du musst deinem Fenster auch die Chance geben das Edit neu zu zeichnen.

Ansonsten: http://filesplitter.michael-puff.de
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#3

Re: Dateien zerlegen und zusammenfügen

  Alt 14. Apr 2006, 23:36
Das ist jetzt zawr OT, aber manch einer könnte sich mal 'ne Scheibe von der Formatierung und der Präsentation deines Beitrages abschneiden

Zu deiner Problem: Versuche mal einen delay von 100 ms zu durchlaufen, bevor du den text des Edits änderst. Den Code zu dieser Procedure findest du hier: click me
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Dateien zerlegen und zusammenfügen

  Alt 14. Apr 2006, 23:38
Oder einfach ein Application.ProcessMessages; rein.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Dateien zerlegen und zusammenfügen

  Alt 14. Apr 2006, 23:52
@bscreator
Noch einige Anmerkungen zu Deinem Code:

1.) Du solltest die Datei nur schließen, wenn sie auch geöffnet wurde. Die Anweisungen AssignFile und Reset müssen also vor dem TRY-Block stehen.
2.) Die Vergleiche mit True und False sind nicht notwendig und können in bestimmten Situationen sogar zu falschen Ergebnissen führen. Die Erklärung dafür findest Du hier.
3.) Delphi-Referenz durchsuchenFileSize

Die geänderte Version des Codes (incl. Luckies Vorschlag):

Delphi-Quellcode:
Exists := false;
Pos := 0;

if (FileExists(Edit1.Text)) then
begin
  Res := DisableWriteProtection(Edit1.Text); //Schreibschutz aufheben
  Edit4.Text := 'Waiting...';
  Edit4.Refresh;

  AssignFile(F, Edit1.Text); //Dateipointer zuweisen
  Reset(F); //Datei öffnen
         
  try //Anzahl der Datensätze ermitteln

    Seek(F,0); //Satzzeiger an Anfang

    While (NOT EOF(F)) do
    begin
      Pos := Pos + 1;
      Seek(F, Pos);
    end;

    Edit4.Text := IntToStr(Pos);
 
  finally
    CloseFile(F);
  end;
end;
Gruß Hawkeye

[edit=Sharky]Session-ID aus dem Link entfernt. Mfg, Sharky[/edit]
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Dateien zerlegen und zusammenfügen

  Alt 15. Apr 2006, 13:02
Hallo.

Im gezeigten Code scheint F vom Typ File zu sein - sonst macht Seek() keinen Sinn. Beim Öffnen der Datei muss die Satzgröße 1 angegeben werden, sonst können nur Dateien korrekt verarbeitet werden, deren Größe ein Vielfaches von 128 (Standard-Satzgröße) ist. Das Schieben des Satzzeigers von einem zum nächsten Datensatz macht eigentlich keinen Sinn, da die Anzahl der Bytes in einer Datei nicht durch Abzählen, sondern direkt über die Metadaten des Dateisystems (FileSize - hallo Hawkeye) ermittelt werden kann. In keinem Fall ist es notwendig den Schreibschutz aufzuheben, da die Datei nur gelesen werden soll.

Für das Zerlegen beliebiger Dateien in mundgerechte Stücke ist TFileStream die bessere Lösung, da diese Komponente direkt auf dem Dateisystem aufsetzt. Die Implementierung von File und TextFile stand noch sehr stark unter dem Eindruck von CP/M.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#7

Re: Dateien zerlegen und zusammenfügen

  Alt 15. Apr 2006, 14:51
Delphi-Quellcode:
...
  Res := DisableWriteProtection(Edit1.Text); //Schreibschutz aufheben
  ...
  Reset(F); //Datei öffnen
  ...
    Seek(F,0); //Satzzeiger an Anfang

    While (NOT EOF(F)) do
    begin
      Pos := Pos + 1;
      Seek(F, Pos);
    end;
    ...
Zum Lesen braucht man den Schreibschutz nicht aufheben. Besser dürfte sein, die Datei nur zum Lesen zu öffnen:
FileMode := 0; Der Befehl gehört zwischen AssignFile und Reset. Sonst bekommt man bei schreibgeschützten Dateien bei Reset einen IOError.

Reset (F) öffnet die Datei und setzt den Zeiger auf den Anfang der Datei. Deshalb sollte Seek (F, 0) eigentlich überflüssig sein.

Die while-Schleife macht aus dem von marabu genannten Grund keinen Sinn.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
bscreator

Registriert seit: 20. Jan 2005
Ort: Kempten
15 Beiträge
 
#8

Re: Dateien zerlegen und zusammenfügen

  Alt 15. Apr 2006, 15:00
Application.ProcessMessages - Wie konnt ich das nur vergessen...

Ich weiß, manchmal red ich um den heißen Brei rum, ich versuch meine "Schwierigkeiten" mal so zu beschreiben:

1. Einen n-Byte großen Arbeitsspeicherbereich reservieren (als Dateipuffer)
2. n-Bytes aus der geöffneten Datei lesen und in den zuvor reservieren Arbeitsspeicherbereich übertragen (Brauch ich dann File of Byte 3. Die n-Bytes vom Arbeitsspeicher in eine neu erstellte Datei übertragen

PS: Mit GetMem(Typ of Integer) kann man ja einen n-Byte großen Arbeitsspeicherbereich reservieren. Aber wird dieser
Speicherbereich dann "automatisch", sprich in diesem Fall als Dateipuffer, verwendet, oder brauch ich da eine Art Handle ?


4. Ich weiß nicht, irgendwie bereitet mir das Wort "Datensatz" Probleme. Meinen die mit Datensatz die einzelnen Bytes, aus
denen eine Datei besteht und ist jeder Datensatz 1 Byte groß ?

PS: Mit Edit4.Refresh hat es geklappt, FileMode := fmOpenRead hab ich jetzt auch schon eingefügt.

Ich versuchs erstmal mit den wahrscheinlich einfacheren Delphi-Funktionen und erst dann werd ich das ganze nochmal mit Windows-API Funktionen versuchen (erst stehen, dann fliegen)

Vielen Dank für eure schnellen und hilfreichen Antworten. Wünsch euch allen im Vorraus (hoffe, das bringt kein Unglück) ein frohes Ostereiersuchen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Dateien zerlegen und zusammenfügen

  Alt 15. Apr 2006, 15:22
Warum benutzt du keine Streams? Oder die Windows-API Funbktionen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
bscreator

Registriert seit: 20. Jan 2005
Ort: Kempten
15 Beiträge
 
#10

Re: Dateien zerlegen und zusammenfügen

  Alt 17. Apr 2006, 10:29
Ich werd das ganze jetzt mit Streams versuchen. Allerdings beantwortet mir weder die Delphi-Hilfe, noch das Delphi-Buch meine einfachen Fragen über Streams. Vielleicht könnt ihr mir helfen, bzw. meine Aussagen auf Richtigkeit hin kontrollieren:

1. Mit TFileStream.Create wird ein Stream, bzw. eine Datei auf der Festplatte angelegt
2. Mit TMemoryStream.Create wird ein Stream im Arbeitsspeicher angelegt

3. Um eine Datei zu kopieren, brauch ich TMemoryStream, um die Daten aus der Quelldatei in den Arbeitsspeicher zu verschieben und TFileStream, um die Daten aus dem Arbeitsspeicher auf die Festplatte zu speichern

Hab leider nicht allzuviel Ahnung über Streams.
Vielen Dank
  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 15:33 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