![]() |
FileToString: Wie String zu "StringToFile?"
Hallo DP,
Der Code aus der DP funktioniert ganz gut. Aber mit den StringToFile stehe ich auf dem Kriegsfuss. Für mein Tool, dass ich der DP Delphi Cleaner zur Verfügung gestellt habe, läuft die CopyDir wahrscheinlich zu langsam. Daher habe ich alle Files schon beim Suchen über FiletoString eingelesen. Nun bauche ich alle Strings wieder als File... Nur wie? Hier der funktionierende Code aus der DP:
Delphi-Quellcode:
Könnt Ihr mir wieder mal weiterhelfen? :thumb:
function FileToString(const FileName: string): AnsiString;
var fs: TFileStream; Len: Integer; begin fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Len := fs.Size; SetLength(Result, Len); if Len > 0 then fs.ReadBuffer(Result[1], Len); finally fs.Free; end; end; Beste Grüße Go2EITS |
Re: FileToString: Wie String zu "StringToFile?"
Schon mal mit .WriteBuffer versucht?
|
Re: FileToString: Wie String zu "StringToFile?"
Hallo, mkinzler, nett dass Du bei mir reinsiehst.
Ähm, das ist ja das Problem. Tstream.read und write habe ich mir schon im Tutorial der dsdt.de angesehen. Wie setzte ich denn den Code oben um? Wäre ja nicht nur für mich interessant. Also ich habe mal jetz so angefangen. Natürlich könnte ich wohl eine Fehlermeldung zurückgeben, wenn der Stream nicht korrekt geschreiben wurde.
Delphi-Quellcode:
So funktioniert es ja nicht. Das Result ist ein Schmarren, weil ich ja eine Procedure habe.
Procedure StringToFile(VAR FileName, Str: string);
var fs: TFileStream; Len: Integer; begin fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Len := fs.Size; SetLength(Result, Len); if Len > 0 then fs.WriteBuffer(Result[1], Len); finally fs.Free; end; end; Magst Du den Code mal verbessern? :pale: |
Re: FileToString: Wie String zu "StringToFile?"
Delphi-Quellcode:
so müsstes gehn :)
Procedure StringToFile(VAR FileName, Str: string);
var fs: TFileStream; Len: Integer; begin fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Len := Length(Str); fs.Write(Len, SizeOf(Integer)); fs.Write(Str[1], Len); finally fs.Free; end; end; Gruß Neutral General |
Re: FileToString: Wie String zu "StringToFile?"
Hallo,
seid ihr sicher, dass das stimmt :?:
Delphi-Quellcode:
Ich denke wenn man in den Stream reinschreiben möchte sollte man ihm das auch sagen :)
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
Delphi-Quellcode:
mfg Leonard
fs := TFileStream.Create(FileName, fmCreate);
|
Re: FileToString: Wie String zu "StringToFile?"
Ich habe gerade noch über den Code gegrübelt und den Vorschlag von mkinzler zum laufen gebracht. Ich probiere das gerade mal:
Delphi-Quellcode:
Ich habe keine Ahnung, ob es Wirklich geht. Mein Tool braucht mit CopyDir zu lange. Es wird noch dauern, bis ich weiss, ob und was letztendlich zuverlässig funzt... falls nicht, probiere ich Deinen Vorschlag, Neural general! Dankeschön schon mal vorab aun Euch [roter Kasten ] drei! Auf writebuffer wäre ich nicht gekommen. :thumb:
Procedure StringToFile(VAR FileName, Str: string);
var fs: TFileStream; Len: Integer; begin fs := TFileStream.Create(FileName, fmCreate); try Len := fs.Size; SetLength(str, Len); if Len > 0 then fs.WriteBuffer(str[1], Len); finally fs.Free; end; end; Roter Kasten! Oha, Leonhard, ichglaube Du hast recht! Ändere ich gleich oben noch. |
Re: FileToString: Wie String zu "StringToFile?"
Hallo,
ich kann zwar keinen Sinn darin erkennen den Inhalt einer beliebigen Datei (binär?, riesig?) als String im Hauptspeicher zu lagern, aber wenn überhaupt, dann würde ich einen MemoryStream als Zwischenlager benutzen. Die Größe der ursprünglichen Datei darf natürlich nicht geschrieben werden, da so der Dateiinhalt verändert wird:
Delphi-Quellcode:
Getippt und nicht getestet.
procedure LoadStream(s: TStream; fn: TFileName);
var fs: TFileStream; begin fs := TFileStream.Create(fn, fmOpenRead or fmShareDenyWrite); try s.CopyFrom(fs, fs.Size); s.Position := 0; finally fs.Free; end; end; procedure SaveStream(s: TStream; fn: TFileName); begin with TFileStream.Create(fn, fmCreate) do try s.Position := 0; CopyFrom(s, s.Size); finally Free; end; end; Freundliche Grüße vom marabu |
Re: FileToString: Wie String zu "StringToFile?"
@marabu
Na nun kann ich mich garnicht entscheiden... Es sind 951 Files mit insgesamt 1,79 MB. Alles überflüssige Dateien. Die lese ich gerade in eine Stringlist ein. Und nun statt 10 Minuten Backup mit Copydir, 10 Sekunden. Alles ist angelegt, aber die Files sind 0-Bytes. Mein Codde geht also nicht. War auch ein wenig zu schnell.. Ich probiere den Code von Neutral General aus. Natürlich mit der Änderung von Leonhard. Ca. 15 Sekunden! Ich sehe nach und 951 Files, 1,79 MB und 406 sind im Backupordner. Suuuuper! Ich hatte die Daten aber schon beim Suchen der betreffenden Files wegen der Performance in eine Stringlist eingelesen. Aber bei 1,91 MB. So der Zwischenstand. Ich probiere mal den Code von marabu auch aus. Der ist wohl für größere Dateien geeignet. Und dann gibt es nachher gleich ein Update von dem Tool Delhi Cleaner, ![]() Ihr dürft es gerne mal ansehen. Lasst Euch mal überraschen, wie viele entbehrliche Dateien Eure Festplatten belegen. Bis später... und vielen Dank! :thumb: :thumb: :thumb: |
Re: FileToString: Wie String zu "StringToFile?"
@Marabu
Mit den Streams scheitere ich leider schon bei den Übergabeparametern. Dein Code sieht aber interessant aus. Da benötige ich mehr LernZeit um ein Stream zu erstellen, damit ich den als Parameter Deinen Proceduren übergeben kann. Dies ist aber nicht allein das Problem. Es stellt sich ja die Frage der Weiterverarbeitung bzw. Zugriff der Daten. Aber das Problem ist ja gelöst: Hier nochmals der vollständige richtige Code, den ich verwendet habe, weil viele Threads oft die richtige Lösungen leider offen lassen, dass neue Thread notwendig werden. Daher der funktionierende und vollständige Code nachfolgend: FileToString:
Delphi-Quellcode:
Und wieder zurück mit StringToFile
function FileToString(const FileName: string): AnsiString;// inline;
var fs: TFileStream; Len: Integer; begin fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Len := fs.Size; SetLength(Result, Len); if Len > 0 then fs.ReadBuffer(Result[1], Len); finally fs.Free; end; end;
Delphi-Quellcode:
EDIT: Nachträglich var in Const geändert, lt. marabu
Procedure StringToFile(const FileName, Str: string);//Inline;
var fs: TFileStream; Len: Integer; begin fs := TFileStream.Create(FileName, fmcreate); try Len := Length(Str); fs.Write(Len, SizeOf(Integer)); fs.Write(Str[1], Len); finally fs.Free; end; end; Betraf ursprünglichen Code: Procedure StringToFile(VAR FileName, Str: string);//Inline; Inline verwende ich unter Turbo2006. Viel Vergnügen und beste Grüße. Go2EITS |
Re: FileToString: Wie String zu "StringToFile?"
Guten Morgen.
Zitat:
Delphi-Quellcode:
Die Parameter der Prozedur StringToFile() solltest du besser als Konstanten übergeben. Ein Blick mit dem Windows Explorer auf das Dateisystem sollte dir offenbaren, dass die beiden Dateien aus meiner Testroutine einen Größenunterschied von 4 Byte aufweisen.
var
s: String; fn: TFileName; begin fn := ChangeFileExt(ParamStr(0), '.tmp'); s := FileToString(ParamStr(0)); StringToFile(fn, s); if FileToString(fn) = s then ShowMessage('passed') else ShowMessage('failed'); end; // procedure StringToFile(const FileName, Str: String); Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 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