Datei umbenennen Groß/Kleinbuchstaben

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von VB.neter0101.

    Datei umbenennen Groß/Kleinbuchstaben

    Hallo,

    mich würde interessieren, wie man Dateien in einem Verzeichnis so umbenennt, dass ihre Buchstaben mit einer Aktion groß sind.
    BSP: hhh.txt --> HHH.txt

    Ich kenne bereits die Methoden Upper/Lower... nur es ergibt sich ein Problem beim Umbenennen.

    VB.NET-Quellcode

    1. My.Computer.FileSystem.RenameFile("C:\Users\Documents\hhhh.txt", "HHHH.txt")


    Die Fehlermeldung ist eigentlich recht logisch:

    Ein Ausnahmefehler des Typs "System.IO.IOException" ist in Microsoft.VisualBasic.dll aufgetreten.
    Zusätzliche Informationen: Der Vorgang konnte nicht abgeschlossen werden, da bereits eine Datei im Pfad C:\Users\Documents\HHHH.txt vorhanden ist.


    Im Explorer kann man die Datei natürlich immer noch umbenennen. Daher die Frage, wie kann ich das mit VB Code realisieren?

    Danke für kommende Antworten
    Danke für eure Antworten:

    VB.NET-Quellcode

    1. Dim StrExt5 As String = System.IO.Path.GetExtension(fullname5)
    2. MessageBox.Show("Extention:" + StrExt5)
    3. Dim StrFileName5 As String = System.IO.Path.GetFileNameWithoutExtension(fullname5)
    4. MessageBox.Show("Without Extention:" + StrFileName5)
    5. Dim upperString As String
    6. upperString = StrFileName5.ToUpper
    7. MessageBox.Show("Upper: " + upperString)
    8. My.Computer.FileSystem.RenameFile(fullname5, upperString + StrExt5)


    So habe ich mir das eigentlich gedacht. My.Computer werde ich jetzt mal mit der moderneren Variante ersetzen.


    Interessant ist natürlich auch, dass System.IO.File.Move("C:\A\hhh.txt", "C:\A\HHH.txt") funktioniert... Komisch

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB.neter0101“ ()

    Falls Du ein wenig mehr Hintergrundwissen haben willst, bei stackoverflow die Antwort mit den 37 Berwertugnen anschauen: stackoverflow.com/questions/19…w-to-rename-a-file-in-net

    Dort wird auch auf den Unterschied zwischen System.Io.File.Move und System.IO.FileInfo.MoveTo eingeganen.

    Zudem noch der Hinweis auf: Visual Studio - Empfohlene Einstellungen

    Alles was nicht zu C# kompatibel ist oder noch aus VB6-Zeiten stammt, sollte aus den VB.Net Programmen verschwinden, wenn man das ganze nicht nur auf Anfänger-Niveau betreiben will.

    Interessant ist natürlich auch, dass System.IO.File.Move("C:\A\hhh.txt", "C:\A\HHH.txt") funktioniert... Komisch

    Nö - da System.IO eben moderner ist und die aktuellen Windows-APIs benutzt - wie der Windows-Explorer und da funktioniert es ja auch!

    System.IO.File.Move unterscheidet halt zwischen Klein- und Großbuchstaben im Dateinamen - hhh.txt und HHH.txt sind also unterschiedlich!

    My.Computer.FileSystem.RenameFile arbeitet eher wie unter DOS, wo zwischen Klein- und Großbuchstaben nicht wirklich unterschieden wird.

    Edit: @Niko Ortner hat es natürlich noch wesentlich besser erklärt!


    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Thias“ ()

    Information:
    Windows behandelt Dateinamen case-insensitive:

    Wenn man My.Computer.FileSystem.MoveFile dekompiliert (z.B. mit ILSpy), dann kommt man irgendwann bei System.IO.File.Copy (nicht Move sondern Copy!) und dann bei der Win32-Funktion CopyFile raus. Wenn man das selber hin schreibt, fliegt auch eine Exception:

    VB.NET-Quellcode

    1. 'IOException: Die Datei "C:\Users\Niko\Desktop\ASDF.txt" ist bereits vorhanden.
    2. System.IO.File.Copy("C:\Users\Niko\Desktop\asdf.txt", "C:\Users\Niko\Desktop\ASDF.txt", False)

    Vereinfacht sieht der Code so aus:

    C#-Quellcode

    1. public static void Copy(string sourceFileName, string destFileName, bool overwrite)
    2. {
    3. //...
    4. InternalCopy(sourceFileName, destFileName, overwrite, true);
    5. }
    6. internal static string InternalCopy(string sourceFileName, string destFileName, bool overwrite, bool checkHost)
    7. {
    8. //...
    9. if (!CopyFile(sourceFileName, destFileName, !overwrite))
    10. {
    11. // Exception werfen
    12. }
    13. }
    14. [DllImport("kernel32.dll", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true)]
    15. internal static extern bool CopyFile(string src, string dst, bool failIfExists);

    Man beachte den letzten Parameter failIfExists. Der ist hier True. Wenn Du also hhh.txt zu HHH.txt umbenennen willst, wird geprüft, ob am Zielort schon eine Datei namens HHH.txt existiert. Da hhh.txt und HHH.txt als gleich betrachtet werden, wird davon ausgegangen, dass die Datei schon existiert -> Exception fliegt.
    Hier die Dokumentation dazu (steht beim Parameter bFailIfExists):
    msdn.microsoft.com/en-us/libra…255&MSPPError=-2147217396
    If this parameter is TRUE and the new file specified by lpNewFileName already exists, the function fails. If this parameter is FALSE and the new file already exists, the function overwrites the existing file and succeeds.


    System.IO.File.Move dagegen verwendet die Win32-Funktion MoveFile: msdn.microsoft.com/en-us/libra…a365239%28v=vs.85%29.aspx
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @VB.neter0101 Was hat die Groß- oder Kleinschreibung für einen Zweck, da Windows das nicht unterscheidet?
    Soll das lediglich im Explorer schön aussehen oder ist das ein Test der IO-Funktionalität?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    @VB.neter0101 Was hat die Groß- oder Kleinschreibung für einen Zweck, da Windows das nicht unterscheidet?
    Soll das lediglich im Explorer schön aussehen oder ist das ein Test der IO-Funktionalität?


    Genau, ich versuche ein bisschen zu testen und mich dieser Thematik einfach mal vertraut zu machen. Ob jetzt TEST ORDNER oder Test Ordner, ist mir eigentlich egal. Ich wollte einfach mal wissen, was die IO so her gibt.