Adjust Filename to exact spelling (case sensitive)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Adjust Filename to exact spelling (case sensitive)

    Hi,

    Nehmen wir an, ich habe eine Datei "C:\test\data.txt"

    Weiterhin habe ich eine Variable, die den Dateipfad enthält:

    Dim RealOldObject as String = "C:\test\DATA.TXT"

    Wie man sieht, weicht der reale Dateiname vom Inhalt der Variablen RealOldObject bezüglich der Groß-/Kleinschreibung ab.

    Ich möchte nun prüfen, ob die Filenamen voneinander abweichen und wenn ja, dann möchte ich den realen Namen korrigieren, d.h. die Datei soll nachher DATA.TXT heißen.

    Das habe ich wie folgt versucht:

    VB.NET-Quellcode

    1. Private Sub AdjustCase(RealOldObject As String)
    2. Dim RealNewName As String = Path.GetFileName(RealOldObject)
    3. Dim fi = New IO.FileInfo(RealOldObject)
    4. If RealNewName = fi.Name Then Exit Sub
    5. fi.MoveTo(Path.Combine(fi.DirectoryName, RealNewName))


    Das klappt aber nicht. fi.Name enthält "DATA.TXT", obwohl die Datei real "data.txt" heißt. Und deshalb wird die Prozedur mit dem "Exit Sub" verlassen!

    Wie komme ich denn an den "case sensitiven" Filenamen heran? Klar, ich könnte das Verzeichnis auslesen ... aber das scheint mir sehr umständlich zu sein!

    Weiß jemand eine bessere Lösung?

    LG
    Peter
    Hier ein kleines Beispiel:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim t1 = "data.txt"
    3. Dim t2 = "DATA.txt"
    4. Dim t3 = "data.txt"
    5. Console.WriteLine(t1.Equals(t2).ToString())
    6. Console.WriteLine(t1.Equals(t3).ToString())
    7. Console.ReadLine()
    8. End Sub


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    WhitePage schrieb:

    Dein Thread:


    Jau, dieser Thread ist mir noch in sehr guter Erinnerung. Und daher habe ich das ja auch mit der fi.MoveTo Methode!

    Aber jetzt geht es nicht darum den Filenamen case sensitive zu SETZEN, sondern case sensitive AUSZULESEN!

    Mhh ... ich hoffe, ich habe mein Anliegen verständlich machen können.

    LG
    Peter
    Hi
    enumeriere halt die Dateien des Pfades mit dem entsprechenden Dateinamen und prüfe, ob die gefundenen Dateien dem entsprechen. Einfach System.IO.Directory.EnumerateFiles aufrufen und dort pattern auf den Dateinamen setzen und FirstOrDefault aufrufen. Wenn der Wert Null ist, existiert die Datei nicht, sonst ist ihr Name, was darinsteht. Allerdings frage ich mich noch immer, welcher Sinn hinter deiner Vorgehensweise liegt.

    Viele Grüße
    ~blaze~
    Danke für deinen Rat, fichz.

    Aber ich glaube, du hast mein Problem nicht so ganz verstanden. Es geht nicht um den Vergleich .... es geht darum den case sensitiven realen Namen der Datei zu ermitteln! Das ist mein Problem. Also: ich weiß es gibt eine Datei "DATA.TXT" ... und jetzt möchte ich wissen, wie sie exakt auf der Platte abgespeichert ist, also "Data.txt" oder "data.TXT" oder ...

    Jetzt klar was ich suche?

    @blaze

    ok, dann will ich mal versuchen meine Anwendung kurz zu beschreiben:

    Ich sichere meine privaten Verzeichnisse und Dateien täglich auf ein externes Festplattenlaufwerk. Alle Verzeichnisse und Dateien haben identische Namen.

    Wenn ich nun die Schreibweise eines Directories oder einer Datei auf dem Quell-Laufwerk ändere, dann möchte ich das Directory bzw. die Datei auf dem Ziel-Laufwerk beim nächsten Sicherungslauf ebenfalls in die gleiche Schreibweise ändern.

    File.Exists bzw. Directory.Exists gibt mir in jedem Fall "True" zurück. Also muss ich die GENAUE Schreibweise der Datei auf dem Sicherungslaufwerk ermitteln.

    Jetzt klar, was ich möchte? Ist doch ganz sinnvoll, hehehe ...

    LG
    Peter

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Peter329“ ()

    Peter329 schrieb:

    Jetzt klar was ich suche?
    Du darfst die Schreibweise nicht vorgeben, sondern Du musst sie auslesen:

    VB.NET-Quellcode

    1. Dim fi() = New IO.DirectoryInfo("C:\Temp\").GetFiles("data.txt", IO.SearchOption.TopDirectoryOnly)
    2. If (fi(0).Name <> "DATA.TXT") Then
    3. fi(0).MoveTo("C:\Temp\DATA.TXT")
    4. End If
    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!
    Yip ... RFG hat verstanden was ich suche ! :)

    Man muss also doch den realen Namen aus dem Verzeichnis auslesen! So hatte ich das ja auch schon in meinem Eingangsposting als Option erwähnt. Offensichtlich gibt es dazu keine Alternative.

    In dem Sinne hab ich die Sache jetzt realisiert ... natürlich kostet das ein bissl Overhead aber es funktioniert!

    Also, herzlichen Dank an alle Ratgeber und Daumen hoch!

    LG
    Peter