none
Probleme mit My.Computer.FileSystem.MoveFile und Umlauten in Consolenanwendung

    Frage

  • Hallo Leute,

    ich möchte in einer Consolenanwendung eine Datei mit

    => My.Computer.FileSystem.MoveFile

    verschieben. Dabei kann der Zieldateiname Umlaute enthalten. Bei einem 'ü' erhalte ich aber als Ergebnis immer ein ³ .

    Hat einer eine Idee wie ich das Problem lösen kann?
    (Ein 'ue' ist für mich nicht akzeptabel! :-) )

    Gruß Ahmed

    Samstag, 19. Januar 2013 19:04

Antworten

Alle Antworten

  • Hallo,

    wenn ich folgenden Code ausführe, dann funktioniert alles problemlos:

        Sub Main()
            My.Computer.FileSystem.MoveFile("C:\testäöüß.txt", "C:\testäöüß_new.txt")
        End Sub

    Alternativ kannst du auch folgenden Code probieren:

    Imports System.IO
    File.Move("C:\testäöüß.txt", "C:\testäöüß_new.txt")

    Das wäre auch eher für .NET Programme gedacht.

    Wenn du keine VB.NET Konsole, sondern eine VB Classic Konsole hast, dann kann diese einige Zeichen nur unter besonderen Einstellungen anzeigen. .NET benutzt automatisch Unicode. Ich kenne mich jedoch fast nicht mit dem normalen VB aus.


    Koopakiller [kuːpakɪllɐ] | Webseite | Code Beispiele | Facebook | Snippets

    Samstag, 19. Januar 2013 19:20
    Moderator
  • Hallo Ahmed,

    das Problem tritt üblicherweise auf, wenn man eine ANSI Zeichenfolge (z. B. Windows Codepage 1252)
    in eine DOS Codepage (z. B. 850 oder 437) konvertiert. Als Beispiel:

            Dim quellDatei As String = "ÄÖÜäöüß.TXT"
    
            ' Zeichen nach ANSI
            Dim ansiEncoding = System.Text.Encoding.GetEncoding(1252)
            Dim ansiBytes = ansiEncoding.GetBytes(quellDatei)
    
            ' (ANSI) Zeichen in DOS-Zeichensatz
            Dim dosEncoding = System.Text.Encoding.GetEncoding(850)
            Dim dosString = dosEncoding.GetString(ansiBytes)
            ' "Seltsame" Zeichen bei DOS
            Console.WriteLine("ANSI '{0}' => DOS '{1}'", ansiEncoding.GetString(ansiBytes), dosEncoding.GetString(ansiBytes))
    

    das "ü" wird dabei zum "³" (hochgestellte 3).

    Die .NET Methoden selbst verursachen das Problem normalerweise nicht und NTFS speichert Dateinamen in Unicode; Probleme könnten nur andere Dateisystem machen. Die Eingabeaufforderung z.B. konvertiert die Namen entsprechend der Codepage (siehe chcp).

    FileSystem.MoveFile ist nur eine (überflüssige) Verpackung für System.IO.File.Move.

    Die Frage wäre: Wo kommt der Dateiname her?
    oder wird die Datei auf einem anderen Dateisystem (FAT, LINUX via Samba) gespeichert?

    Gruß Elmar

    Samstag, 19. Januar 2013 20:38
    Beantworter
  • Also ich habe das noch einmal getestet.

    Wenn ich im Debug.Modus arbeite, dann funktioniert alles richtig.

    Rufe ich aber eine Batchdatei mit den Schaltern auf, dann kommt es zu dem Fehler. Das Problem ist dann also doch nur die DOS-Codepage. Im cmd-Fenster wird der Dateiname schon falsch an mein Programm übergeben.

    Wie kann ich das Problem nun beheben?

    Gruß Ahmed

    Samstag, 19. Januar 2013 22:06
  • Hallo Leute,

    also ich habe eine Lösung gefunden:

    wenn ich in der Bachtdatei wie folgt erweitere dann funktioniert es:

    chcp 1252
    /Schalter=TütTatüt.txt

    Nun ist es ja sehr umständlich. Kann ich diese Konvertierung nicht auch in meinem Programm durchführen?

    Und wenn ja, gibt es noch etwas zu beachten, wenn mein Programm über VBA aufgerufen wird?

    Der Anwender soll möglichst wenig damit zu tun bekommen.

    Vielen Dank im voraus.

    Gruß Ahmed

    Samstag, 19. Januar 2013 22:20
  • Hallo Ahmed,

    was ich oben für den Fehler gezeigt hatte, kann man auch in der anderen Richtung durchführen, also von DOS => ANSI.

    Das verwendete Encoding für Ein-/Ausgabe kann man ermitteln über

    Console.WriteLine("Input Encoding " & System.Console.InputEncoding.CodePage.ToString())
    Console.WriteLine("Output Encoding " & System.Console.OutputEncoding.CodePage.ToString())
    

    Wobei Deine Antwort leider nicht so richtig klärt, wo der falsche Zeichensatz herkommt. Denn wenn man ein Konsolenprogramm in der Eingabeaufforderung startet und einen Parameter mit Umlauten übergibt tritt das Problem so nicht auf.

    Gruß Elmar

    Samstag, 19. Januar 2013 22:26
    Beantworter
  • Hallo Elmar,

    also du hast recht, wenn ich folgenden Code im cmd-Fenster verwende läuft alles einwandfrei:

    myProgramm /Target="C:\Users\Ahmed\Test\Müppe1.pdf"

    Der gleiche Aufruf in einer Batchdatei gepackt und diese dann aufgerufen, führt zu diesem Fehler. Im DOS-Fenster kann ich im Aufruf schon sehen.

    Verwende ich aber in der Batch folgendes:

    chcp 1252
    myProgramm /Target="C:\Users\Ahmed\Test\Müppe1.pdf"

    dann wird mein ü auch richtig interpretiert.

    Ich werde das noch einmal in Ruhe anschauen.

    Vielen Dank für Deine Mühen.

    Gruß Ahmed

    Sonntag, 20. Januar 2013 00:48
  • Am 20.01.2013 schrieb Ahmed Martens:

    Verwende ich aber in der Batch folgendes:

    chcp 1252
    myProgramm /Target="C:\Users\Ahmed\Test\Müppe1.pdf"

    dann wird mein ü auch richtig interpretiert.

    Schreib die Batch und wähle dann Speichern unter. Bei meinem W7 kann
    ich ganz unten in dem Dialog die Codierung auswählen.

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Sonntag, 20. Januar 2013 12:19
  • Hallo Ahmed,

    wenn Du Dateinamen oder anderen Texte in Batch-Dateien ablegst, so musst daran denken, dass dort im Standard Codepage 850 (oder auch 437) gilt.

    Speicherst Du sie mit dem Windows Editor o. ä. so wird aber i. a. ANSI (wie 1252) verwendet.

    Du musst entweder mit Visual Studio das Encoding festlegen (Speichern unter...) oder einen anderen Editor der auch OEM Formate speichern kann verwenden.

    Gruß Elmar

    Sonntag, 20. Januar 2013 19:42
    Beantworter
  • Hallo Elmar,

    das war des Rätsels Lösung.

    Ich hatte meine Batchdatei mit Notepad++ erstellt und dort wird immer Codepage 1252 verwendet. Erst nachdem ich über Kodierung -> Zeichensatz auf OEM 850 umgestellt hatte, funktionierte die Batchdatei einwandfrei.


    Hallo Winfried,

    <Zitat>

    Schreib die Batch und wähle dann Speichern unter. Bei meinem W7 kann
    ich ganz unten in dem Dialog die Codierung auswählen.

    </Zitat>

    Welches Programm und welchen Zeichensatz verwendest du denn?

    Ich muss in Notepad++ immer explizit OEM 850 auswählen, damit es einwandfrei funktioniert.

    Gruß Ahmed

    Montag, 21. Januar 2013 17:46
  • Am 21.01.2013 schrieb Ahmed Martens:

    Welches Programm und welchen Zeichensatz verwendest du denn?

    Ich benutze immer das Notepad das bei Windows dabei ist. Hauptsache Du
    hast eine Lösung gefunden. ;)

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Montag, 21. Januar 2013 18:14
  • Hallo Ahmed,

    Erkennen kann kein Programm DOS (oder ANSI Zeichensätze), da es kein Merkmal dafür gibt (im Gegensatz zu Unicode mit seiner BOM).

    Man kann einen OEM Zeichensatz (und viele andere) aber auch in Visual Studio auswählen, wenn man über Datei->Speichern unter geht.

    Siehe auch Joe Spoelsky: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

    sollte man gelesen haben und sich vor allem merken:
    There Ain't No Such Thing As Plain Text. ;)

    Gruß Elmar

    • Als Antwort markiert Ahmed Martens Montag, 21. Januar 2013 19:14
    Montag, 21. Januar 2013 18:24
    Beantworter
  • Danke für die Info.

    Ich werde das noch einmal in Ruhe testen und mir die Thematik versuchen anzueignen. Ich hätte nicht gedacht, dass dies so schwer sein kein.

    Gruß Ahmed

    Montag, 21. Januar 2013 19:14