Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Datei mit Steuerzeichen in StringList laden? (https://www.delphipraxis.net/193195-datei-mit-steuerzeichen-stringlist-laden.html)

SneakyBagels 4. Jul 2017 10:07

AW: Datei mit Steuerzeichen in StringList laden?
 
Zitat:

Haben wir denn eine konkrete Beispiel-Datei?
Ja. Siehe Beitrag #1. Alle Dateien in C:\Users\<name>\AppData\Roaming\Microsoft\Windows\ Recent\CustomDestinations

TiGü 4. Jul 2017 10:11

AW: Datei mit Steuerzeichen in StringList laden?
 
Zitat:

Zitat von SneakyBagels (Beitrag 1375925)
Zitat:

Haben wir denn eine konkrete Beispiel-Datei?
Ja. Siehe Beitrag #1. Alle Dateien in C:\Users\<name>\AppData\Roaming\Microsoft\Windows\ Recent\CustomDestinations

Er meinte eher sowas wie:
"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."

Der schöne Günther 4. Jul 2017 10:14

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.

TiGü 4. Jul 2017 10:18

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.

SneakyBagels 4. Jul 2017 10:24

AW: Datei mit Steuerzeichen in StringList laden?
 
Zitat:

Zitat von TiGü (Beitrag 1375933)
Wahrscheinlich wäre es sinnvoller zu fragen, was Sneaky eigentlich genau erreichen möchte?

Zitat:

Ziel ist es: ich möchte einen SubString in der Datei finden und dafür keine extra 3rd Party Unit verwenden.
:P

Es hat nun funktioniert.

Delphi-Quellcode:
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;
Eins möchte ich betonen: Herr Jaenikes Units ist wirklich super!
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:
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;
Sieht nun so aus
Delphi-Quellcode:
begin
 if FileExists(aFile) then
  Result := TFile.ReadAllText(aFile, TEncoding.UTF8);

 Result := Trim(Result);
end;

Uwe Raabe 4. Jul 2017 10:50

AW: Datei mit Steuerzeichen in StringList laden?
 
Zitat:

Zitat von SneakyBagels (Beitrag 1375935)

Es hat nun funktioniert.

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

Das könnte man eventuell noch etwas optimieren:

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;

SneakyBagels 4. Jul 2017 10:54

AW: Datei mit Steuerzeichen in StringList laden?
 
Ich nehme an
Zitat:

[dcc32 Warnung] W1000 Symbol 'SearchBuf' ist veraltet: 'Moved to the AnsiStrings unit'
kann ich einfach ignorieren?

Und dann noch die Frage:
gibt es irgendeinen Unterschied zwischen
Delphi-Quellcode:
ByteArray: TBytes;
und
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.

Uwe Raabe 4. Jul 2017 11:35

AW: Datei mit Steuerzeichen in StringList laden?
 
Zitat:

Zitat von SneakyBagels (Beitrag 1375937)
Ich nehme an
Zitat:

[dcc32 Warnung] W1000 Symbol 'SearchBuf' ist veraltet: 'Moved to the AnsiStrings unit'
kann ich einfach ignorieren?

Kannst du ignorieren, denn wenn du AnsiStrings und StrUtils einbindest, kommt der Fehler "Doppeldeutiger überladener Aufruf von 'SearchBuf'".

Zitat:

Zitat von SneakyBagels (Beitrag 1375937)
Und dann noch die Frage:
gibt es irgendeinen Unterschied zwischen
Delphi-Quellcode:
ByteArray: TBytes;
und
Delphi-Quellcode:
ByteArray: TArray<Byte>;
?
Weil laut Deklaration in System sehe ich keinen.

Nein, ist von der Deklaration her kein Unterschied. Allerdings kann man ein
Delphi-Quellcode:
TArray<Byte>
nicht immer dort einsetzen, wo ein
Delphi-Quellcode:
TBytes
erwartet wird. Deswegen nimmt man besser gleich
Delphi-Quellcode:
TBytes
.

Zitat:

Zitat von SneakyBagels (Beitrag 1375937)
Ich kenne mich mit Pointern kein bisschen aus. Ist es auch möglich nun die Position von newPos herauszufinden? InToStr() funktioniert hier leider nicht.

Klar geht das:
Delphi-Quellcode:
I := newPos - @ByteArray[0];
(es lebe die Pointer-Arithmetik!)

Je nachdem, was du genau machen willst, ist das aber vielleicht gar nicht nötig.

SneakyBagels 4. Jul 2017 11:46

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?

TiGü 4. Jul 2017 12:28

AW: Datei mit Steuerzeichen in StringList laden?
 
Zitat:

Zitat von SneakyBagels (Beitrag 1375935)
Zitat:

Zitat von TiGü (Beitrag 1375933)
Wahrscheinlich wäre es sinnvoller zu fragen, was Sneaky eigentlich genau erreichen möchte?

Zitat:

Ziel ist es: ich möchte einen SubString in der Datei finden und dafür keine extra 3rd Party Unit verwenden.
:P

Danke danke, mein Lese- und Textverständnis ist im Gegensatz zu anderen ganz ausgezeichnet.
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.

http://blogs.microsoft.co.il/sasha/2...-destinations/
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
https://tzworks.net/prototype_page.php?proto_id=20
http://www.mycsharp.de/wbb2/thread.php?threadid=105016


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 Uhr.
Seite 2 von 3     12 3      

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