AGB  ·  Datenschutz  ·  Impressum  







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

Dateiinhalt teilweise löschen

Ein Thema von blablab · begonnen am 23. Apr 2012 · letzter Beitrag vom 23. Apr 2012
Antwort Antwort
Seite 1 von 2  1 2      
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#1

Dateiinhalt teilweise löschen

  Alt 23. Apr 2012, 10:16
Hallo!

Angenommen ich habe ein 4GB großes Video und möchte daraus nur das zehnte Byte löschen, dann fällt mir spontan nur ein, die komplette Datei ohne dieses Byte erneut zu schreiben. Ist das tatsächlich notwendig oder kann man das irgendwie umgehen?

Theoretisch müsste das doch möglich sein, denn die Datei ist ja in Clustern auf der Festplatte gespeichert. Es würde also ausreichen den ersten Cluster gegen einen anderen auszutauschen und die anderen beizubehalten.

Gibt es da eine Möglichkeit?

Grüße
blablab
  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
 
#2

AW: Dateiinhalt teilweise löschen

  Alt 23. Apr 2012, 10:19
Sorry, Schmarrn, ich hatte gelesen überschreiben nicht löschen ....
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
Benutzerbild von himitsu
himitsu

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

AW: Dateiinhalt teilweise löschen

  Alt 23. Apr 2012, 10:20
Im ersten Cluster löschst du das Byte, dafür wird ein Byte aus dem zweiten Cluster geholt und hinten an das Erste gehängt, damit dieser Cluster wieder komplett ist, dann wird aus dem Dritten ein Byte an den Zweiten gehängt, aus dem Vierten Eines an den Dritten, aus dem Fünften an den Vierten usw.

Die einzige Möglichkeit sind SpraseFiles, aber die werden nicht von jedem Dateisystem unterstützt.
(hatte noch keine Zeit mich damit zu beschäftigen, aber diese technik wird für die NTFS-komprimierten Dateien genutzt, damit dort Stückchenweise komprimiert und gespeichert werden kann, womit man dann bei Änderung eines Bereichs nicht gleich die ganze Datei neu schreiben muß)


Ach ja, du brauchst natürlich nur alle Bytes ab dem zu löschenden Byte um 1 Byte vorzukopieren.
Also alles oder stückchenweise in einen Puffer kopieren und etwas weiter Vorne wieder abspeichern.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Apr 2012 um 10:24 Uhr)
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Dateiinhalt teilweise löschen

  Alt 23. Apr 2012, 10:26
Eine vielleicht etwas dumme Frage aber: Muss die Datei denn am Clusteranfang anfangen? Kann da nicht das erste Zeichen ungenutzt bleiben und der Dateiinhalt fängt dann erst beim 2. Zeichen an?

Edit:
War etwas verwirrt, weil beim Defragmentieren ja oft steht es befänden sich mehrerer Dateien in einem Block. Aber ein Block ist hier ja eine Menge vieler Cluster...

Geändert von blablab (23. Apr 2012 um 10:39 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#5

AW: Dateiinhalt teilweise löschen

  Alt 23. Apr 2012, 10:42
Ich kenne jetzt nicht Ntfs, aber bei dem einem System mit dem ich mich mal genauer beschäftigte war es nicht möglich. Denn, wozu der Aufwand? Bei den vollen Blöcken gab es eine Adresse auf den nächsten Block, bei dem letzten Block die Länge der genutzten Bytes. Mag sein, dass es aber Ntfs anders ist.

//Edit:
Unter Block verstehe ich wiederum die kleinste Einheit.
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Dateiinhalt teilweise löschen

  Alt 23. Apr 2012, 10:46
Um mein Problem etwas genauer zu beschreiben:

Ich möchte eine Art Archiv machen, also eine Datei in der mehrere Dateiinhalte hintereinander stehen. Ich weiß jetzt aber nicht, was ich machen soll, wenn ich eine Datei aus dem Archiv löschen will. Denn ich möchte die Größe des Archivs nicht einschränken, das soll ruhig mehrere Gigabyte groß werden können und das wird es in der Praxis auch. Aber wenn ich dann nur eine einzige Datei lösche die eher am Anfang des Archivs steht, kann ich doch nicht den ganzen Dateiinhalt kopieren. Ich kann den Benutzer doch nicht nach jedem Löschvorgang 2 Minuten warten lassen...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

AW: Dateiinhalt teilweise löschen

  Alt 23. Apr 2012, 10:57
Also bei 7Zip tust du das und wartest bei großen Archiven.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Dateiinhalt teilweise löschen

  Alt 23. Apr 2012, 11:01
. Aber wenn ich dann nur eine einzige Datei lösche die eher am Anfang des Archivs steht, kann ich doch nicht den ganzen Dateiinhalt kopieren. Ich kann den Benutzer doch nicht nach jedem Löschvorgang 2 Minuten warten lassen...
Du könntest auch vor jedem Datenblock ein "deleted" Flag einbauen.
Ist dieses gesezt wird der Datenblock übersprungen.

Dann kannst Du noch eine "purge"-Routine einbauen, welche die als gelöscht markierten Blöcke
aus dem Archiv entfernt - das Archiv also komprimiert.
Diese Aktion könnte im Hintergrund laufen - oder auch scheduled des Nachts.

Grüße
Klaus
Klaus

Geändert von Klaus01 (23. Apr 2012 um 11:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Dateiinhalt teilweise löschen

  Alt 23. Apr 2012, 11:05
Du hast irgendwo eine Liste mit den enthaltenen Dateien (eventuell auch Mehrere),
dort steht drinne wo die Datei anfängt und wie lang sie ist.

- beim Löschen wird einfach der Eintrag gelöscht
- beim Verkleinern einer Datei werden nur die Daten dieser Datei und ihre gespeicherte Länge geändert
- beim Vergrößern schaust du, ob hinter der Datei noch genug Platz ist (eventuell auch vor der Datei)
- - wenn ja, dann wird die Datei dort reingeschrieben und die Positions- und Größeninfo angepaßt
- - wenn nein, dann wird eine neue Stelle gesucht, also ein ausreichend großer freier Plattz irgendwo mittendrin oder die Datei wird hinten angehängt

Dadurch bleiben zwar Leerräume, welche man aber über eine Optimierungsfunktion/Defragmentierung bezeitigen kann.
Enteder manuell aufgerufen oder direkt beim Schließen des Archivs.

PS: So in etwa arbeiten auch Datenbanken und Dateisystemtreiber.
Du könntest natürlich auch eine Datenbank verwenden, so ala Firebird Embedded.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#10

AW: Dateiinhalt teilweise löschen

  Alt 23. Apr 2012, 11:10
Moin moin,

menno - himitsu hat irgendwie meinen Beitrag kopiert und unter seinem Namen gepostet

Nee... ich bin einfach zu langsam beim tippen gewesen
Peter
-= Gruss Peter =-
-= alias x000x =-
  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 01:07 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