2008-10-01 6 views
6

Aus irgendeinem Grund sind in letzter Zeit die * .UDL-Dateien auf vielen meiner Client-Systeme nicht mehr kompatibel, da sie einmal als ANSI-Dateien gespeichert wurden erwartetes UNICODE-Dateiformat. Das Endergebnis ist ein Fehlerdialog, der besagt "die Datei ist keine gültige zusammengesetzte Datei".Öffnen Sie eine ANSI-Datei und speichern Sie eine Unicode-Datei mit Delphi

Was ist der einfachste Weg, diese Dateien programmatisch zu öffnen und als Unicode-Datei zu speichern? Ich weiß, dass ich das tun kann, indem ich jeden im Editor öffne und dann als die selbe Datei speichere, aber mit dem "Unicode", der im Kodierungsbereich des Speichern als gewählt wurde, aber ich muss dies im Programm tun, um die Unterstützung zu reduzieren Anrufe.

Dieses Problem ist sehr einfach zu duplizieren, erstellen Sie einfach eine * .TXT-Datei in einem Verzeichnis, benennen Sie es um * .UDR, dann bearbeiten Sie es mit dem Microsoft Editor. Dann öffne es im Editor und speichere die Datei als ANSI-kodierte Datei. Versuchen Sie, die udl vom udl-Editor zu öffnen und es wird Ihnen sagen, dass es beschädigt ist. dann speichern Sie es (mit Notepad) als eine Unicode-codierte Datei und es wird wieder ordnungsgemäß geöffnet.

+0

Von welcher Version von Delphi sprechen wir? –

+0

Delphi Version 2006 oder 2009. – skamradt

Antwort

7

Dies ist sehr einfach mit meiner TGpTextFile Einheit zu tun. Ich werde eine kurze Probe zusammenstellen und hier posten.

Es sollte auch sehr einfach mit dem neuen Delphi 2009 sein - verwenden Sie es vielleicht?

EDIT: Dies ist, wie Sie es mit meinem Zeug in Delphis vor 2009 tun können.

var 
    strAnsi : TGpTextFile; 
    strUnicode: TGpTextFile; 
begin 
    strAnsi := TGpTextFile.Create('c:\0\test.udl'); 
    try 
    strAnsi.Reset; // you can also specify non-default 8-bit codepage here 
    strUnicode := TGpTextFile.Create('c:\0\test-out.udl'); 
    try 
     strUnicode.Rewrite([cfUnicode]); 
     while not strAnsi.Eof do 
     strUnicode.Writeln(strAnsi.Readln); 
    finally FreeAndNil(strUnicode); end; 
    finally FreeAndNil(strAnsi); end; 
end; 

Lizenz: Das obige Codefragment gehört zur Public Domain. Benutze es trotzdem wie du willst.

9

Ok, mit Delphi 2009 konnte ich den folgenden Code erstellen, der funktioniert, aber ist es der richtige Weg, diese Konvertierung durchzuführen?

var 
    sl : TStrings; 
    FileName : string; 
begin 
    FileName := fServerDir+'configuration\hdconfig4.udl'; 
    sl := TStringList.Create; 
    try 
    sl.LoadFromFile(FileName, TEncoding.Default); 
    sl.SaveToFile(FileName, TEncoding.Unicode); 
    finally 
    sl.Free; 
    end; 
end; 
+0

Kein abstrakter Fehler für tStrings.Create ??? –

+0

Ja, TStringList sollte viel besser sein :) – gabr

+0

Ansonsten ist der Code in Ordnung (und es funktioniert auch, ich habe gerade überprüft). – gabr