AGB  ·  Datenschutz  ·  Impressum  







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

FileToString: Wie String zu "StringToFile?"

Ein Thema von Go2EITS · begonnen am 26. Sep 2006 · letzter Beitrag vom 24. Aug 2007
Antwort Antwort
Seite 1 von 3  1 23      
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#1

FileToString: Wie String zu "StringToFile?"

  Alt 26. Sep 2006, 15:47
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?
Beste Grüße
Go2EITS
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: FileToString: Wie String zu "StringToFile?"

  Alt 26. Sep 2006, 15:49
Schon mal mit .WriteBuffer versucht?
Markus Kinzler
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#3

Re: FileToString: Wie String zu "StringToFile?"

  Alt 26. Sep 2006, 16:01
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?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: FileToString: Wie String zu "StringToFile?"

  Alt 26. Sep 2006, 16:03
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Leonard

Registriert seit: 12. Okt 2005
Ort: Lutherstadt Eisleben
64 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: FileToString: Wie String zu "StringToFile?"

  Alt 26. Sep 2006, 16:11
Hallo,

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

fs := TFileStream.Create(FileName, fmCreate); mfg Leonard
Tobias
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#6

Re: FileToString: Wie String zu "StringToFile?"

  Alt 26. Sep 2006, 16:21
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.

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

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

Re: FileToString: Wie String zu "StringToFile?"

  Alt 26. Sep 2006, 16:22
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
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#8

Re: FileToString: Wie String zu "StringToFile?"

  Alt 26. Sep 2006, 16:47
@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!
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#9

Re: FileToString: Wie String zu "StringToFile?"

  Alt 26. Sep 2006, 19:02
@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
  Mit Zitat antworten Zitat
marabu

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

Re: FileToString: Wie String zu "StringToFile?"

  Alt 27. Sep 2006, 06:32
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 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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