| 
| Autor | Beitrag |  
| Klaus Müller 
          Beiträge: 58
 Erhaltene Danke: 1
 
 W2000,XP,W2k2S,W2k3S,S2k7S
 Delphi XP
 
 | 
Verfasst: Do 18.02.10 16: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:
 		                       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:='/e ' + V_File + ' ' + '"' + V_Key + '"';
 
 ShellExecAndWait('regedit.exe',V_Parameter);
 End;
 |  Das klappt so auch einwandfrei. 
 Nun gehe ich her und lese die zwei Textdateien ein und kopiere sie in eine zusammen.
 Mit:
 												| 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);
 
 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);
 
 
 
 
 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  Narses: 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 16:56, insgesamt 3-mal bearbeitet
 |  |  |  
| Xion 
          
  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)
 
 | 
Verfasst: Do 18.02.10 16: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 
          
  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)
 
 | 
Verfasst: Do 18.02.10 19:34 
 
	  |  Klaus Müller hat folgendes geschrieben  : |  	  | 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?
 | 
   Es funktioniert wunderbar, aber es sind '' nach jedem Zeichen?     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 
          Beiträge: 75
 Erhaltene Danke: 1
 
 Windows 2000
 D6, D7, D2007, Lazarus
 
 | 
Verfasst: Fr 19.02.10 00:35 
 
Hallo Klaus Müller, zwei Dateien zusammenführen??
 Ich glaub ich verstehe dein Problem nicht richtig?
 		                       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  
          Beiträge: 58
 Erhaltene Danke: 1
 
 W2000,XP,W2k2S,W2k3S,S2k7S
 Delphi XP
 
 | 
Verfasst: Mo 19.04.10 14: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 
          Beiträge: 1085
 Erhaltene Danke: 53
 
 WinXP, Win7, Win10
 Delphi 7 Enterprise, XE
 
 | 
Verfasst: Mo 19.04.10 14: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  
          Beiträge: 58
 Erhaltene Danke: 1
 
 W2000,XP,W2k2S,W2k3S,S2k7S
 Delphi XP
 
 | 
Verfasst: Di 20.04.10 14:45 
 
Hallo Alf,
 Danke für den Hinweis, habe mir doch schon fast so was gedacht, werde es demnächst test.
 |  |  |  |