Autor |
Beitrag |
Klaus Müller
      
Beiträge: 58
Erhaltene Danke: 1
W2000,XP,W2k2S,W2k3S,S2k7S
Delphi XP
|
Verfasst: 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:
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 17: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 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
      

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 20: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 01: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 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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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 
      
Beiträge: 58
Erhaltene Danke: 1
W2000,XP,W2k2S,W2k3S,S2k7S
Delphi XP
|
Verfasst: 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.
|
|
|