Wie kann ich zwischen einer Datei und einem Verzeichnis unterscheiden

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Bernd.

    Wie kann ich zwischen einer Datei und einem Verzeichnis unterscheiden

    Hallo zusammen,

    ich schreibe an eine kleinen Funktion die mir ein File kopieren soll.
    Nun soll diese Funktion unterscheiden ob das Ziel nun komplett ist oder nur die Angabe eines Verzeichnis.

    Unterschieden werden soll

    VB.NET-Quellcode

    1. Privat Function Copieren(Quelle, Ziel) As ....


    Es handelt sich nur um das Ziel.

    Der User könnte folgende Anforderung schicken

    VB.NET-Quellcode

    1. Copieren(Quelle, "C:\Temp")
    2. ' oder
    3. Copieren(Quelle,"C:\Temp\Test.txt")


    Wenn die Angabe des Ziel einen Filenamen enthält ist ja alles OK.
    Wenn aber die Angabe des Ziel nur eine Folder ist, muss diese Funktion ja den Filenamen aus der Quelle Extrahieren und ans Ziel anhängen.

    IO.Path.Combine() habe ich mir angesehen.
    Damit finde ich keine Möglichkeit.
    Uri.Scheme() habe ich mir auch angesehen.
    Damit finde ich auch keine Möglichkeit.

    Gibt es eine andere Möglichkeit die ich nicht kenne oder muss ich mir da etwas eigenes schreiben ?


    lieben dank

    Bernd

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bernd“ ()

    Du kannst den Test einer FileInfo und einer DirectoryInfo-Instanz zuordnen und die Eigenschaften abfragen.
    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!
    Viertletzte Stelle prüfen... Wenn es ein . ist, wird danach wohl die Dateiendung kommen und somit isses ne Datei...
    Dann musste dir nurnoch die letzte Stelle des \ suchen und danach killen ;)

    So in der Art?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ich kenne mich auf dem Gebiet jetzt leider nicht aus...

    aber ein Verzeichnis endet idR mit "\", oder zumindest ohne Dateiendung.

    Ließe sich dies dann nicht mit einfachen Mittel überprüfen?

    VB.NET-Quellcode

    1. If Ziel.EndsWith("\") Then
    2. ...
    3. End If


    Oder auf eine Dateiendung überprüfen, ob es auf "\.[.+?]{1, 5}" endet?
    (Der regEx dürfte net genau stimmen, müsste man noch weitere Punkte ausnehmen und auch andere Sonderzeichen, die auf ein Directiory hinweißen ("/", "\") und dass dannach nichts mehr kommen sollte... hab grade die RegEx nimma im Kopf.

    lg. Kagu

    (ansonsten kläre mich bitte ein wenig auf soweit möglich :) )

    Edit

    MemoAnMichSelbst schrieb:

    Viertletzte Stelle prüfen...

    Dateiendungen sind nicht unbedingt 3 Stellen lang... html zum Beispiel.

    Ich kenne welche von 1 bis 5 Zeichen Endung
    @MemoAnMichSelbst:
    Es gibt Dateien ohne Extension und es gibt Verzeichnisse mit Extension.
    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!
    Okay. Du hast völlig recht ^^
    Gab es nicht mal sowas wie "GetAttr" ?! Wo man sowas prüfen konnte?

    VB.NET-Quellcode

    1. If GetAttr("C:\Test") = FileAttribute.Directory Then
    2. End If
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Also, wenn ich dich richtig verstehe, dann möchtest du eine Kopieren Funktion für Ordner/Dateien, und die Funktion soll selber erkennen, ob das Ziel eine Datei oder ein Ordner ist?
    Die einzige Möglichkeit die ich sehe, ist zu prüfen, ob das Ziel ein existierender Ordner ist.
    Wenn nicht, wird eine Angabe als Datei angenommen, wobei du dann noch prüfen musst, ob der Ordnerpfad zur Datei existiert.

    Generell kann man in meinen Augen nicht unterscheiden, ob es ein Datei -oder Ordnername ist. Es sei denn, du legst Konventionen fest, was eine Datei oder ein Ordner ist.
    Ein Ordner kann auch Test.txt heißen, eine Datei halt auch MeinOrdner.

    Wie gibt denn der User die Parameter ein?
    Soll das ne dll werden oder ist das Teil eines Programms (mit Oberfläche).
    Ich denke, es mach mehr Sinn, dass der Anwender bestimmen muss, ob es eine Datei/Ordner ist.

    Ciao Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Es wird jedoch richtig erkannt ob es sich um ein Verzeichnis oder um eine Datei handelt

    VB.NET-Quellcode

    1. If System.IO.File.Exists(TextBox1.Text) Then
    2. Debug.Print("FILE")
    3. ElseIf System.IO.Directory.Exists(TextBox1.Text) Then
    4. Debug.Print("DIRECTORY")
    5. Else
    6. Debug.Print("NOTHING")
    7. End If


    Habe einen Ordner Names Drucker.txt erstellt und eine Datei Drucker (ohne Endung) und es wird richtig erkannt.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Zu erkennen ob eine existierende Datei/Ordner eine Datei/Ordner ist, ist nicht schwer.
    Zu erkennen ob ein reiner Name eine Datei oder ein Ordner ist, geht m.W. nicht, denn es ist ja nicht gesagt, dass diese existieren.
    Wenn als Ziel etwas angegeben ist, was NICHT im FileSystem existiert, woran soll man dann erkennen, ob das eine Datei oder ein Ordner werden soll, wenn man es nicht explizit angibt?

    Daher entweder Konventionen wie: Ordner enthalten NIE einen ".", Dateien enthalten IMMER einen "." festlegen oder explizit den Anwender festlegen lassen.
    Letzteres scheint mir sinnvoller.
    Das ist meine Signatur und sie wird wunderbar sein!
    im wesentlichen hat fichz das prob doch gelöst - oder kapiere ich was falsch?

    er findet die 3 Möglichkeiten, die ein Pfad bedeuten kann, und nun liegts an bernds KopierRoutine, entsprechend zu agieren:

    Case IsFolder: file hineinkopieren
    Case IsFile: Fehler werfen oder Datei überschreiben
    Case IsNixVonBeidem: annehmen, dasses eine neu zu erstellende Datei-Angabe sein soll.

    vlt. sollteman sone KopierRoutine auch aufteilen in
    .CopyTo(filePath)
    und
    .CopyInto(directoryPath)
    Finde auch dass der Lösungsansatz stimmt, wenn er ja einfach Testet, gibbet ne Datei und gibbet nen Folder...

    Ich glaube nicht dass er im OS den Ordner "Ente" im Ordner "Wurst" erstellen kann und die datei "Ente" im Ordner "Wurst". Dann bekommt er die meldung, dass bereits eine Datei mit dem Namen da ist (grad getestet).
    Logisch nachvollziehbar, dass somit der Pfad weiter gehen müsste bei Ordner Ente und Datei Ente... weil dann dass eine im anderen liegt evtl.

    Daher funktioniert der Ansatz von fichz, seine Dialoge testen ja auf ordner und File...
    Was ist, wenn die Angabe ein Ordner sein soll, der noch nicht existiert?


    .CopyTo(filePath)
    und
    .CopyInto(directoryPath)


    Das ist denke ich das gescheiteste.

    Ciao
    Das ist meine Signatur und sie wird wunderbar sein!
    Wow tolles Thema,
    vielen dank an alle die da mitmachen.

    Aber die Fragestellung wird vermutlich falsch Interpretiert oder falsch verstanden.

    Wenn der User (das Programm) nicht den Namen der Zieldatei angibt, was dann ?
    Somit kann man folgendes gleich mal ausschließen:

    VB.NET-Quellcode

    1. If System.IO.File.Exists(

    Das sagt ja nur aus, das das Ziel nicht vorhanden ist.
    Nicht aber ob die Angabe des Pfades mit oder ohne Angebe des File Namen war.

    Alle anderen Ansätze, auch mit FileInfo hatte ich bereits geprüft. Die bringen aber leider keine Lösung.

    Was mir sagt
    es gibt keine fertige Lösung im FW.

    OK
    dann schreibe ich mir selber was.
    Doch, mit File.Exists kannst du auch unterscheiden zwischen Pfad einer Datei oder Pfad eines Ordners.
    Wenn die Funktion True zurückgibt, ist es eine Datei. Ansonsten ein Verzeichnis oder der Pfad existiert gar nicht. Das kannst du dann eben noch mit Directory.Exists überprüfen. Ein Beispiel findest du ja eigentlich schon oben.

    Infinity schrieb:

    Doch, mit File.Exists kannst du auch unterscheiden zwischen Pfad einer Datei oder Pfad eines Ordners.
    Wenn die Funktion True zurückgibt, ist es eine Datei. Ansonsten ein Verzeichnis oder der Pfad existiert gar nicht. Das kannst du dann eben noch mit Directory.Exists überprüfen. Ein Beispiel findest du ja eigentlich schon oben.


    Darum geht's doch nicht.
    Die Routine soll das auch erkennen wenn der Pfad oder die Datei NICHT existiert ;)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Das ist dann nicht möglich. Außer man geht davon aus, dass Dateien immer eine Endung haben und Ordnernamen nie einen Punkt beinhalten.

    Aber da Bernd ja die Dateien kopieren will, nehme ich an, dass sie auch vorhanden sind.

    Bernd schrieb:

    Das sagt ja nur aus, das das Ziel nicht vorhanden ist.
    Nicht aber ob die Angabe des Pfades mit oder ohne Angebe des File Namen war.

    C:\Temp\Test\Text.txt
    C:\Temp\Test\Text2.txt

    Das eine ist eien Datei, das andere ein Verzeichnis. Das kann mak erst unterscheiden, wenn es da ist.
    Wenn es nicht da ist, muss dazugesagt werden, was es sein soll.
    Bilder
    • Verzeichnis.jpg

      7,48 kB, 201×174, 2.434 mal angesehen
    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!
    So ich glaube ich habe die Lösung,
    ich habe das mal schnell getestet. Müsste aber meinen Erwartungen entsprechen. Ich hoffe ich habe nichts übersehen.

    Ich frage einfach mal ab ob das Directory existiert.
    Wenn ja war die Angabe garantiert ein Directory.
    Also muss der DateiName aus der Quellangabe extrahiert und ans Ende des Ziel angefügt werden.

    Wenn nicht gibt es das Directory nicht oder es war die Angabe eines File.
    Wenn es ein Directory war, es dieses aber nicht gibt muss das Directory auf jeden Fall angelegt und die Datei Kopiert werden.

    War es ein File wir auch Kopiert.

    Mal als Anschauung

    VB.NET-Quellcode

    1. If Not IO.Directory.Exists(Path1.LocalPath) Then
    2. RTB_Rechts.AppendText("Der Pfad Existiert nicht oder die Angabe war ein File.")
    3. Else
    4. RTB_Rechts.AppendText("Pfad Existiert. Die Angabe war mit oder ohne PathSeparator am ende.")
    5. RTB_Rechts.AppendText("Der Dateiname muss aus der Quelle Extrahiert und ans Ende angefügt werden.")
    6. End If


    Nun ohne die Else Anweisung. Die ist überflüssig.
    Somit bleibt:

    VB.NET-Quellcode

    1. If IO.Directory.Exists(Path1.LocalPath) Then
    2. RTB_Rechts.AppendText("Pfad Existiert. Die Angabe war mit oder ohne PathSeparator am ende.")
    3. RTB_Rechts.AppendText("Der Dateiname muss aus der Quelle Extrahiert und ans Ende angefügt werden.")
    4. ' Extract "FileName" from source and place it to the end of target.
    5. ' Ziel = .................................
    6. End If
    7. ' Kein Else
    8. Copieren(Quelle, Ziel)


    Das war mal wieder eine schöne Aufgabe.

    Danke an alle. Es macht immer wieder Spass mit euch.
    Es bringt immer so viele Gedankenanstöße.

    Bernd