![]() |
Datei mit Steuerzeichen in StringList laden?
Ist es möglich mit einer normalen StringList (oder etwas anderem was bei Delphi dabei ist) eine Datei die die, die man in folgendem Verzeichnis findet in einen String zu laden?
Ziel ist es: ich möchte einen SubString in der Datei finden und dafür keine extra 3rd Party Unit verwenden. => C:\Users\<name>\AppData\Roaming\Microsoft\Windows\ Recent\CustomDestinations |
AW: Datei mit Steuerzeichen in StringList laden?
Es ist alles möglich.
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Classes; var Stream: TStringStream; filename: string; begin try filename := 'C:\Users\Horst\AppData\Roaming\Microsoft\Windows\Recent\CustomDestinations\e0e944739d076ab.customDestinations-ms'; Stream := TStringStream.Create; Stream.LoadFromFile(filename); Writeln(Stream.DataString); Stream.Free; Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
AW: Datei mit Steuerzeichen in StringList laden?
An Streams habe ich noch nicht gedacht.
Leider ist bei mir DataString immer leer. Selbst wenn die Datei offensichtlich eine Größe > 0Byte hat. |
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
![]() |
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
|
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
Zitat:
Zum Vergleich: diese Unit schafft es die Dateien zu lesen ![]() |
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
So debugge er es hin! |
AW: Datei mit Steuerzeichen in StringList laden?
Size ist nicht 0.
Size entspricht der Dateigröße in Bytes. |
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
|
AW: Datei mit Steuerzeichen in StringList laden?
Haben wir denn eine konkrete Beispiel-Datei? Wenn ich mitten in eine "Text"-Datei ein Nullbyte reinpacke hat ReadAllText damit kein Problem:
Delphi-Quellcode:
uses
System.SysUtils, System.Classes, System.IoUtils; const filePath = 'x:\someFile.dat'; DLE = 16; NULL = 0; var bytes: TBytes; stream: TStream; fileContent: String; begin // 1) Datei schreiben TFile.WriteAllText(filePath, 'Vor Steuerzeichen'); bytes := [DLE, NULL]; stream := TFile.OpenWrite(filePath); try stream.Seek(0, TSeekOrigin.soEnd); stream.Write(bytes, 2); finally stream.Destroy(); end; TFile.AppendAllText(filePath, 'Nach Steuerzeichen'); // 2) Datei lesen (einfach) fileContent := TFile.ReadAllText(filePath); WriteLn( fileContent.QuotedString()); ReadLn; end. |
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
|
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
"SneakyBagels, lade doch bitte eine Beispieldatei von DIR hoch, weil bei mir in diesem Ordner 39 Dateien zu finden sind, die zwischen 12 und 25.262 KB groß sind." |
AW: Datei mit Steuerzeichen in StringList laden?
Liste der Anhänge anzeigen (Anzahl: 1)
Vor allem sind das, zumindest bei mir, reine Binärdateien. Irgendwo scheint einmal Text drin zu sein, aber so etwas verwaltet man nicht als String.
|
AW: Datei mit Steuerzeichen in StringList laden?
Wahrscheinlich wäre es sinnvoller zu fragen, was Sneaky eigentlich genau erreichen möchte?
Es gibt möglicherweise eine Windowsfunktion für die Information, die er erfahren möchte. |
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
Zitat:
Es hat nun funktioniert.
Delphi-Quellcode:
Eins möchte ich betonen: Herr Jaenikes Units ist wirklich super!
var
aFile, sSubStr: String; AnsiStr: AnsiString; ByteArray: TArray<Byte>; begin sSubStr := 'DasHierMussGefundenWerden'; aFile := 'C:\Users\<name>\AppData\Roaming\Microsoft\Windows\Recent\CustomDestinations\27932e73jddafda77b.customDestinations-ms'; ByteArray := TFile.ReadAllBytes(aFile); try if Length(ByteArray) > 0 then begin SetString(AnsiStr, PAnsiChar(@ByteArray[0]), Length(ByteArray)); if Pos(sSubStr, AnsiUpperCase(AnsiStr)) - 1 > 0 then // tue etwas, wenn sSubStr in aFile gefunden wurde end; finally SetLength(ByteArray, 0); end; Aber da ich aktuell mein Projekt aufräume und ich versuche einen gewissen Standard einzuhalten, versuche ich Units, die ich nur ein-, höchstens zwei- oder dreimal verwende durch andere Möglichkeiten zu ersetzen. Beispiel. Was vorher so aussah...
Delphi-Quellcode:
Sieht nun so aus
var
sCurrLine, sRes: string; FileReaderEx: TFastFileReader; begin sRes := ''; if FileExists(aFile) then begin FileReaderEx := TFastFileReader.Create(aFile); try while FileReaderEx.Position < FileReaderEx.Size do begin FileReaderEx.ReadLn(sCurrLine); sRes := sRes + sLineBreak + sCurrLine; end; finally FileReaderEx.Free; end; end; {$WARNINGS OFF} Result := Trim(UTF8toString(sRes)); {$WARNINGS ON} end;
Delphi-Quellcode:
begin
if FileExists(aFile) then Result := TFile.ReadAllText(aFile, TEncoding.UTF8); Result := Trim(Result); end; |
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
Delphi-Quellcode:
uses
System.IOUtils, System.StrUtils; ... var aFile, sSubStr: String; ByteArray: TBytes; newPos: PAnsiChar; begin sSubStr := 'DasHierMussGefundenWerden'; aFile := 'C:\Users\<name>\AppData\Roaming\Microsoft\Windows\Recent\CustomDestinations\27932e73jddafda77b.customDestinations-ms'; ByteArray := TFile.ReadAllBytes(aFile); if Length(ByteArray) > 0 then begin newPos := SearchBuf(PAnsiChar(@ByteArray[0]), Length(ByteArray), 0, 0, AnsiString(sSubStr), [soDown]); if newPos <> nil then begin // tue etwas, wenn sSubStr in aFile gefunden wurde end; end; end; |
AW: Datei mit Steuerzeichen in StringList laden?
Ich nehme an
Zitat:
Und dann noch die Frage: gibt es irgendeinen Unterschied zwischen
Delphi-Quellcode:
und
ByteArray: TBytes;
Delphi-Quellcode:
?
ByteArray: TArray<Byte>;
Weil laut Deklaration in System sehe ich keinen. Ich kenne mich mit Pointern kein bisschen aus. Ist es auch möglich nun die Position von newPos herauszufinden? InToStr() funktioniert hier leider nicht. |
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
Zitat:
Delphi-Quellcode:
nicht immer dort einsetzen, wo ein
TArray<Byte>
Delphi-Quellcode:
erwartet wird. Deswegen nimmt man besser gleich
TBytes
Delphi-Quellcode:
.
TBytes
Zitat:
Delphi-Quellcode:
(es lebe die Pointer-Arithmetik!)
I := newPos - @ByteArray[0];
Je nachdem, was du genau machen willst, ist das aber vielleicht gar nicht nötig. |
AW: Datei mit Steuerzeichen in StringList laden?
Ich habe gerade mal messen lassen. Selbe Funktion mit Pos() statt SearchBuf() ist um 50% schneller. Wie kann das sein? Ich dachte Pointer sind das Ultimative Etwas?
|
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
Von daher wäre es vielleicht doch ganz hilfreich zu wissen, WAS genau du in der Datei suchst. Höchstwahrscheinlich kannst du das nämlich viel eleganter mit der Shell-API von Windows abfrühstücken. ![]() ![]() ![]() ![]() |
AW: Datei mit Steuerzeichen in StringList laden?
Also ich weiß nicht was ich antworten soll, denn das habe ich doch schon zweimal geschrieben was gesucht wird :roll:
Das Problem ist ja aber schon gelößt. |
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
|
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
Also...diese Lösung führt dich auf deinem Rechner zum Ziel. So weit so gut. Da du daraus ja so ein großes Geheimnis machst, kann man nur raten was du eigentlich möchtest. Ich vermute, du möchtest die Jump Listen auslesen, um dort nach Recent- oder Frequent-Items zu suchen. Bedenke aber, das diese Lösung höchstwahrscheinlich nur auf deinem Computer funktioniert. Bspw. gibt es in meinen CustomDestinations-Folder keine Datei mit den Namen 27932e73jddafda77b.customDestinations-ms. Dafür aber 39 andere Dateien mit der Endung *.customDestinations-ms. Woher weißt du, welche die richtige ist? Wahrscheinlich ist es nur ein Basteltool für dich selbst. Dann ist das okay. Wenn du aber nach einer allgemeinen Lösung suchst, die auch auf anderen Rechnern bei anderen Benutzern funktionieren soll, dann musst du nochmal in dich gehen und uns genau sagen WAS du suchst und WOZU. |
AW: Datei mit Steuerzeichen in StringList laden?
Zitat:
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 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