Entwickler-Ecke
Dateizugriff - Regedit Export Umkopieren
Klaus Müller - Do 18.02.10 17:45
Titel: Regedit Export Umkopieren
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:
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);
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
Xion - Do 18.02.10 17:48
Mach mal bitte um deinen Code die Delphi Tags rum: [delphi] [/delphi
Xion - 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? |
: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
Astat - 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 - 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 - 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
Klaus Müller - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!