| 

.NET C# Java Javascript Exception

2
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?

Gruss Dave
10.08.2012
david.koenig09 173 6
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.
JEwen 10.08.2012
3 Antworten
2
Hilft Replace("\"", "\\\"")? Die ersten beiden Backslashes werden als Backslash interpretiert, der 3. Backslash als Escape-Zeichen für die Gänsefüßchen.
10.08.2012
KN 1,7k 1 8
0
Hi,

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

stringValue = System.Text.RegularExpressions.Regex.Replace(String.Format("\"{0}\"", (string)rawValue), @"\", @"\");


ersetzt durch

stringValue = rawValue.ToString().Replace("\"", "\\\"");
stringValue = String.Format("\"{0}\"", (string)rawValue);


Was dann passiert war sehr interessant:

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?

Gruss Dave
10.08.2012
david.koenig09 173 6
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..
KN 10.08.2012
ä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?
KN 10.08.2012
nochwas: rawValue.Replace(...) verändert nicht den rawValue, sondern gibt nur den veränderten rawValue zurück.
KN 10.08.2012
0
Oh mann, und wie ich mich verhudelt habe. Jetzt passt es. Vielen dank für das professionelle entfernen des Balkens vor den Augen ;-)
10.08.2012
david.koenig09 173 6
Keine Ursache, sowas passiert uns allem mal. Ich würde mich trotzdem über ein grünes Häkchen zu meiner Antwort freuen.
KN 10.08.2012

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH