Autor Beitrag
Klaus Müller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58
Erhaltene Danke: 1

W2000,XP,W2k2S,W2k3S,S2k7S
Delphi XP
BeitragVerfasst: Do 18.02.10 17:45 
Hallo Programmierer,

Ich habe ein seltsames Verhalten mit Textdateien.
Es geht um ein Programm welches zwei Registry Keys Exportiert.
Hier die Prozedur für den Export:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 
Procedure Use_Regedit(V_File,V_Key:String);
Var V_Parameter:String;
Begin
  If FileExists(V_File) Then DeleteFile(V_File);

  //V_Parameter:='/a ' + V_File + ' ' + '"' + V_Key + '"';
  V_Parameter:='/e ' + V_File + ' ' + '"' + V_Key + '"';

  ShellExecAndWait('regedit.exe',V_Parameter);
  //zB: regedit /e hklm-sw.reg "HKEY_LOCAL_MACHINE\Software"
End;

Das klappt so auch einwandfrei.
Nun gehe ich her und lese die zwei Textdateien ein und kopiere sie in eine zusammen.
Mit:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
 
  If IsUserAnAdmin
  then Begin
    If Form1.SaveDialog1.Execute Then
    Begin
      Use_Regedit(GetTempDir + 'temp1.txt',C_Key1);
      Use_Regedit(GetTempDir + 'temp2.txt',C_Key2);


      AssignFile(Datei_In,GetTempDir + 'temp1.txt');
      {$I-}
      Reset(Datei_In);
      {$I+}

      AssignFile(Datei_Out,Form1.SaveDialog1.FileName);
      {$I-}
      Rewrite(Datei_Out);
      {$I+}


      if IOResult = 0 then Begin

        Readln(Datei_In);
{
        while not Eof(Datei_In) do
        begin
          Readln(Datei_In, V_Zeile);
          Writeln(Datei_Out, String_Normalisirung(V_Zeile));   //String_Normalisirung
        end;
}

        V_BS_Anzahl:=0;

        while not Eof(Datei_In) do
        begin
          Read(Datei_In, V_Ch);
          If V_Ch = '' then
          Else Begin
            If V_Ch='\'
            Then Inc(V_BS_Anzahl)
            Else V_BS_Anzahl:=0;

            If V_BS_Anzahl > 1 Then
            Else Write(Datei_Out, V_Ch);
          End;

        end;

        CloseFile(Datei_In);
        CloseFile(Datei_Out);
      End;

      AssignFile(Datei_In,GetTempDir + 'temp2.txt');
      {$I-}
      Reset(Datei_In);
      {$I+}

      AssignFile(Datei_Out,Form1.SaveDialog1.FileName);
      {$I-}
      Append(Datei_Out);
      {$I+}

      if IOResult = 0 then Begin
        Readln(Datei_In);
{
        while not Eof(Datei_In) do
        begin
          Readln(Datei_In, V_Zeile);
          Writeln(Datei_Out, V_Zeile);  //String_Normalisirung
        end;
}


{
        while not Eof(Datei_In) do
        begin
          Read(Datei_In, V_Ch);
          If V_Ch = '' then
          Else Write(Datei_Out, V_Ch);
        end;
}


        V_BS_Anzahl:=0;

        while not Eof(Datei_In) do
        begin
          Read(Datei_In, V_Ch);
          If V_Ch = '' then
          Else Begin
            If V_Ch='\'
            Then Inc(V_BS_Anzahl)
            Else V_BS_Anzahl:=0;

            If V_BS_Anzahl > 1 Then
            Else Write(Datei_Out, V_Ch);
          End;
        End;

        CloseFile(Datei_In);
        CloseFile(Datei_Out);
      end;
 
      Del_Temp;

      Form1.close;
    End;
  End Else Begin
    Meldung_no_Admin;
    Form1.close;
  End;


Das Funktioniert so auch wunderbar. Nur W A R U M ist das so?
Woher komme das '' nach jedem Zeichen und warum sind die „\\“ auf einmal doppelt.
Hat da jemand eine Erklärung?


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Do 18.02.2010 um 23:37


Zuletzt bearbeitet von Klaus Müller am Do 18.02.10 17:56, insgesamt 3-mal bearbeitet
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 18.02.10 17:48 
Mach mal bitte um deinen Code die Delphi Tags rum: [delphi] [/delphi

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 18.02.10 20:34 
user profile iconKlaus Müller hat folgendes geschrieben Zum zitierten Posting springen:

Das Funktioniert so auch wunderbar. Nur W A R U M ist das so?
Woher komme das '' nach jedem Zeichen und warum sind die „\\“ auf einmal doppelt.
Hat da jemand eine Erklärung?


:gruebel: Es funktioniert wunderbar, aber es sind '' nach jedem Zeichen? :shock: wo sind denn diese '' und \\ ? In der Ausgabe-Datei? Also mir fällt nichts auf an deinem Code.

Edit:
Hab eben mal geguckt, du verwendest da Read statt ReadLn...soweit ich die Hilfe dazu richtig verstanden habe, müsstest du ja bei jedem Read wieder die selbe Zeile bekommen...kann ja an sich nicht sein, dann würde sich ja die Schleife ins endlose verabschieden...

Edit2:
ist vielleicht V_Ch ein Char? Dann ist es aber genau andersrum, dann werden alle \\ zu \ ... das müsste meiner Meinung nach die Funktion der while-Konstruktion sein

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Astat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75
Erhaltene Danke: 1

Windows 2000
D6, D7, D2007, Lazarus
BeitragVerfasst: Fr 19.02.10 01:35 
Hallo Klaus Müller, zwei Dateien zusammenführen??

Ich glaub ich verstehe dein Problem nicht richtig?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure Concate(const AFirstFile, ASecondFile, AOutputFile: string);
var
  ms: TMemoryStream;
  p: pointer;
  cb: int64;
begin
  ms := TMemoryStream.Create;
  ms.LoadFromFile(ASecondFile);
  GetMem(p, ms.size);
  cb := ms.Size;
  move(ms.memory^, p^, ms.Size);
  ms.LoadFromFile(AFirstFile);
  ms.Seek(ms.Size, 0);
  ms.Write(p^, cb);
  ms.SaveToFile(AOutputFile);
  ms.Free;
  freemem(p);
end;



lg. Astat
Klaus Müller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58
Erhaltene Danke: 1

W2000,XP,W2k2S,W2k3S,S2k7S
Delphi XP
BeitragVerfasst: Mo 19.04.10 15:16 
Danke für den interessanten Ansatz, nur leider fehlt ein Filter.
Zur Erklärung von meiner Funktion, es sollen zwei Registry Keys in einer Textdatei mit *.reg
gespeichert werden. Der Hintergrund ist das das der Benutzer ein Programm verändert (zu Testzwecken) das zwei Regkeys verändert, er möchte aber die Original Einstellungen speichern. Das soll nun das Programm erledigen. Danach kann man die Keys löschen und wieder die Originale einspielen, in dem man die erzeugte Datei einfach aufruft.
Bei den Keys die verändert werden handelt es sich allerdings um einen Baum, daher habe ich zum auslesen eine undokumentierte Funktion von „regedit /e“ die man mit google übrigen leicht findet. Nur diese Funktion erzeugt leider einen seltsame Text Datei. Daher ist sie ja wahrscheinlich auch undokumentiert. Diese lese ich nun Zeichenweise (ist also Absicht) ein um den Schrott der in der erzeugten Text Datei (von regedit) steht wieder raus zu filtern.
Es steht nachher in der Text Datei die regedit erzeugt hat, alles ungefähr so:

So soll das Original sein
S o i s t d i e A u g a b e

Es sind also überall Leerzeichen drin, dich ich in meiner Schleife wieder raus Filtere.
Außerdem ist es auch so dass, wenn ein einem Key eine Pfad Angabe ist, diese so raus kommt:

Original Pfad: \Ordenr1\Ordenr2\xy.exe
Ausgabe: \\ O r d n e r 1 \ O r n e r 2 \ x y . e x e

Also ich gebe zu das das eigentlich kein Delphi Problem ist, nur vielleicht hat ha jemand auch so ein Vorhaben und daher habe ich das hier mal gepostet.
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Mo 19.04.10 15:48 
Hi, die Option /e bei regedit erzeugt eine Unicode Ausgabe!
Nimm mal die /a Option. Erzeugt eine asscii Datei!

Vielleicht bringts was.

GRuss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Klaus Müller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 58
Erhaltene Danke: 1

W2000,XP,W2k2S,W2k3S,S2k7S
Delphi XP
BeitragVerfasst: Di 20.04.10 15:45 
Hallo Alf,

Danke für den Hinweis, habe mir doch schon fast so was gedacht, werde es demnächst test.