Hi, ich arbeite an einem registry exporter der im ersten Schritt eine regedit 5 Datei erzeugen soll. Dabei stosse ich auf den folgenden Original String: HKEY_CURRENT_USER\AppEvents\EventLabels\MSMSGS_ContactOnline\DispFileName=@"xpob2res.dll",-41583
In der exportierten REG Datei die ich als Refrenz mit regedit.exe erzeugt habe erscheint der Wert wie folgt: "DispFileName"="@\"xpob2res.dll\",-41583"
Wenn ich den Wert versuche zu schreiben (ich benutze TextWriter.WriteLine), erhalte ich folgende Ergebnisse:
So kommt der Wert an: "@\"xpob2res.dll\",-41583" So muss es aussehen: "@\"xpob2res.dll\",-41583" Das macht C# da draus: "@"xpob2res.dll",-41583" Ergebnis bei Replace("\", "\\") "@"xpob2res.dll",-41583" Ergebnis bei Regex.Replace(rawValue, @"@\", @"@\\") "@"xpob2res.dll",-41583"
Hat irgendwer eine Idee, wie ich den Wert so formatiere, dass ich exakt den gleichen String rausbekomme, wie regedit.exe, also inklusive der beiden backslashes?
Wenn ich ein Consolenprogramm schreibe, welches mit Textwriter.WriteLine einen Wert schreibt, den ich über Console.ReadLine eingebe und zwar genau der Wert wie Du oben beschreibst, dann wird dieser bei mir völlig korrekt in die Textdatei geschrieben. Ich vermute, der Wert wird vorher schon in Deiner Vearbeitung verändert! Zeig doch mal den relevanten Quellcode mit dem Du dies machst.
Hilft Replace("\"", "\\\"")? Die ersten beiden Backslashes werden als Backslash interpretiert, der 3. Backslash als Escape-Zeichen für die Gänsefüßchen.
also folgend der betreffende Code in dem sich das wesentliche abspielt. Ankommen tut der wert als Variable object rawValue. Ich habe mal als Kommentar reingeschrieben, wie der Wert wo aussieht:
case RegistryValueKind.String: // DEBUG: rawValue="@\"xpob2res.dll\",-41583" valueType = String.Empty;
if (rawValue != null) { // Here we add a second backslash in case of a path value and one quotation mark at start and end of the string stringValue = System.Text.RegularExpressions.Regex.Replace(String.Format("\"{0}\"", (string)rawValue), @"\\", @"\\"); // DEBUG: stringValue="\"@\"xpob2res.dll\",-41583\"" } break;
Der stringValue müsste aber eigentlich wie folgt aussehen: stringValue="\"@\\"xpob2res.dll\\",-41583\""
Das ganze funktioniert wunderbar im Falle eines Pfades. Also wird aus rawValue="C:\\Program Files\\NetMeeting\\Blip.wav" der folgende Wert: stringValue="\"C:\\\\Program Files\\\\NetMeeting\\\\Blip.wav\""
Und sollte es sein, nur dann wird bei einem Textwriter.WriteLine wieder der richtige string "C:\Program Files\\NetMeeting\\Blip.wav" in die reg Datei geschrieben (es sollen tatsächlich doppelte Backslashes in der Datei stehen).
Nun bin ich hingegangen und habe den Hinweis von "KN" verfolgt. Ich habe dafur
Die erste Zeile setzt tatsächlich die backslashes wie gewünscht, die zweite Zeile schmeist Sie dann wieder raus. Es scheint also an dem String.Format() zu liegen. Wie kann ich dem dass nun abgewöhnen? Oder gibt es alternativen?
Du willst in der 2. Zeile dem stringvalue vorne und hinten noch Gänsefüßchen hinzufügen? Versuche es mal mit Stringaddition anstatt Format. Das geht dann bei mir. Ist nicht so elegant, aber es geht..
ähhh, ganz anders: was willst du denn mit der 2. Zeile erreichen? Du änderst da doch wieder den rawValue, der die Backslashes so nicht enthält, wie du sie haben möchtest. Kann es sein, dass du dich verhuddelt hast und die 2. Zeile in der Formatanweisung den stringvalue enthalten sollte, den du in der ersten Zeile erzeugt hast?