Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   FileToString: Wie String zu "StringToFile?" (https://www.delphipraxis.net/77900-filetostring-wie-string-zu-stringtofile.html)

Go2EITS 26. Sep 2006 15:47


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:
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;
Könnt Ihr mir wieder mal weiterhelfen? :thumb:
Beste Grüße
Go2EITS

mkinzler 26. Sep 2006 15:49

Re: FileToString: Wie String zu "StringToFile?"
 
Schon mal mit .WriteBuffer versucht?

Go2EITS 26. Sep 2006 16:01

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:
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;
So funktioniert es ja nicht. Das Result ist ein Schmarren, weil ich ja eine Procedure habe.
Magst Du den Code mal verbessern?
:pale:

Neutral General 26. Sep 2006 16:03

Re: FileToString: Wie String zu "StringToFile?"
 
Delphi-Quellcode:
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;
so müsstes gehn :)

Gruß
Neutral General

Leonard 26. Sep 2006 16:11

Re: FileToString: Wie String zu "StringToFile?"
 
Hallo,

seid ihr sicher, dass das stimmt :?:
Delphi-Quellcode:
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
Ich denke wenn man in den Stream reinschreiben möchte sollte man ihm das auch sagen :)

Delphi-Quellcode:
fs := TFileStream.Create(FileName, fmCreate);
mfg Leonard

Go2EITS 26. Sep 2006 16:21

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:
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;
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:

Roter Kasten!
Oha, Leonhard, ichglaube Du hast recht! Ändere ich gleich oben noch.

marabu 26. Sep 2006 16:22

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:
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;
Getippt und nicht getestet.

Freundliche Grüße vom marabu

Go2EITS 26. Sep 2006 16:47

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,Delphi Cleaner Dank Eurer Hilfe!
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:

Go2EITS 26. Sep 2006 19:02

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:
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;
Und wieder zurück mit StringToFile

Delphi-Quellcode:
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;
EDIT: Nachträglich var in Const geändert, lt. marabu
Betraf ursprünglichen Code: Procedure StringToFile(VAR FileName, Str: string);//Inline;

Inline verwende ich unter Turbo2006.
Viel Vergnügen und beste Grüße.
Go2EITS

marabu 27. Sep 2006 06:32

Re: FileToString: Wie String zu "StringToFile?"
 
Guten Morgen.

Zitat:

Hier nochmals der vollständige richtige Code
Sicher kannst du dir nur sein, wenn du die Funktionen auch richtig getestet hast. Es soll ja folgendes gelten:

Delphi-Quellcode:
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);
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.

Zitat:

Zitat von marabu
Die Größe der ursprünglichen Datei darf natürlich nicht geschrieben werden, da so der Dateiinhalt verändert wird:

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr.
Seite 1 von 3  1 23      

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