Windows: Ermitteln, ob Verzeichnis mit Datei verbunden ist

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Windows: Ermitteln, ob Verzeichnis mit Datei verbunden ist

    Hallo,

    Windows merkt sich ja beim Speichern einer Webseite, dass Datei und Verzeichnis miteinander verbunden sind. Dazu wird beim Speichern an das Verzeichnis das Suffix "-Dateien" angehängt:


    Dieses Konstrukt von Windows hat den Vorteil, dass beim Verschieben der gespeicherten HTML-Datei das zugehörige Verzeichnis gleich mit verschoben wird (bzw. beim Löschen der gespeicherten Webseite wird das zugehörige Verzeichnis mit Bild-Dateien, Skripten usw. gleich mit entsorgt).

    Gibt es seitens .NET-Klassenbibliothek eine Möglichkeit, um diese Verknüpfung programmseitig zu ermitteln? Die FileInfo-Klasse scheint hier keine geeignete Methoden zu besitzen.

    Gesucht ist im Grunde soetwas:

    Quellcode

    1. dim fileName = "TolleWebseite.html"
    2. dim dirName = getVerbundenesVerzeichnis(fileName)
    3. ' ...und in dirName hätte ich jetzt folgendes erwartet: "TolleWebseite-Dateien"


    Das kann man natürlich auch irgendwie nachbauen, stelle ich mir wegen Sprachneutralität aber nicht so trivial vor. Daher die Frage: Gibt es soetwas schon?

    Danke für eure Rückmeldungen.
    Ich glaube, dass Du da beim Thema Linking bist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi,

    Danke VaporiZed für Deine Antwort. So wie ich die Microsoft-Doku verstanden habe, geht es beim Threma Linking entweder um Verknüpfungen auf irgendwelche Dateien (Soft Links), die man im Windows Explorer anlegen kann; oder aber alternativ um sog. "Hard Links", mit der das Dateisystem (kann man natürlich auch gezielt per API-Calls steuern) Datei-Duplikate platzsparend ablegt (indem von unterschieldichen Orten im Dateisystem letztendlich auf den selben physikalischen Block auf der Festplatte verwiesen wird). Das ist nicht ganz das was ich suche :(
    @UselessBee Wenn Du eine Web-Seite speicherst, bekommst Du eine HTML-Datei und ein Verzeichnis gleichen Namens:

    Quellcode

    1. Datei: VB-Paradise 2.0 – Die große Visual-Basic- und .NET-Community.htm
    2. Verzeichnis: VB-Paradise 2.0 – Die große Visual-Basic- und .NET-Community-Dateien
    Die Paarung besteht in der Namensgebung.
    Du kannst beide gemeinsam verschieben wohin immer Du willst und es funktioniert.
    Umbenennen würde ich das Verzeichnis nicht, denn in der HTM-Datei wird ein paar Mal auf das Verzeichnis verwiesen.
    Gib denen beim Speichern einen sinnigen Namen und feddich.
    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!
    Genau. Nun möchte ich die HTM-Datei aber (automatisiert) per Programm verschieben und würde gerne das zughörige Verzeichnis mitnehmen. FileSystem.MoveDirectory() erkennt aber nicht die Zuordnung von Datei und Verzeichnis und verschiebt daher ausschließlich die Datei. Das Verzeichnis muss man dann separat als Parameter angeben, wenn es mitkommen soll.
    @UselessBee Es gibt keine Verknüpfung in dem Sinne. Es ist nur eine logische Verknüpfung des Programms, was die Sachen angelegt hat. Wenn es eine Verknüpfung gäbe, würde die Datei auf den Ordner zeigen.

    Das Eine ist eine ganz normale Datei, das Andere ein ganz normaler Ordner. Verschieben kann funktionieren, aber nur, wenn keine kanonischen Pfade in der Datei enthalten sind.
    Diese logische "Verknüpfung" besteht einzig und allein aus dem Namen der beiden.
    Genau deswegen verschiebt das Betriebssystem nichts anderes - weil es keinen Grund dazu hat.

    Da wirst du erst das Eine, dann das Andere verschieben müssen.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    Genau.

    UselessBee schrieb:

    verschiebt daher ausschließlich die Datei.
    Du musst schon zwei Zeilen Code schreiben, um beide Objekte an Deinen Zielort zu verschieben.
    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!
    How does Windows link HTML files to folders?

    This is a shell feature, not a file system feature. The shell copy
    engine just looks for a folder with the same name (plus a localized
    suffix) when copying/moving .htm[l] files.

    This feature is called Connected Files and is documented here.

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

    Kurz gebastelt, geht sicher schöner:

    VB.NET-Quellcode

    1. Function GetConnectedFilesPath(sFilepath As String) As String
    2. Dim _extentions As New List(Of String) From {"_archivos", "_arquivos", "_bestanden", "_bylos", "-Dateien", "_datoteke", "_dosyalar", "_elemei", "_failid", "_fails", "_fajlovi", "_ficheiros", "_fichiers", "-filer", ".files", "_files", "_file", "_fitxers", "_fitxategiak", "_pliki", "_soubory", "_tiedostot"}
    3. Dim TestPathPart As String = IO.Path.Combine(IO.Path.GetDirectoryName(sFilepath), IO.Path.GetFileNameWithoutExtension(sFilepath))
    4. For Each _ext As String In _extentions
    5. If IO.Directory.Exists(TestPathPart & _ext) Then
    6. Return IO.Path.Combine(TestPathPart & _ext)
    7. End If
    8. Next
    9. Return ""
    10. End Function

    HenryV schrieb:

    Kurz gebastelt, geht sicher schöner:

    Super, Danke. Mein eigentliches Anliegen konnte ich nun noch etwas eleganter lösen (s.u.). Danke für Deinen Support!

    RodFromGermany schrieb:

    Du musst schon zwei Zeilen Code schreiben, um beide Objekte an Deinen Zielort zu verschieben.


    Hi, hab mittlerweile weiter recherchiert: per IFileOperation.MoveFiles() wird bei Angabe der Datei auch das zugehörige Verzeichnis verschoben. Das ist genau das was ich gesucht habe. Der User -Franky- für die diversen IFileOperation-Methoden einen hervorragenden Wrapper gebaut:
    Dateien und Ordner löschen, kopieren, verschieben und umbenennen per IFileOperation

    Damit überlasse ich dann Windows zu entscheiden, wann eine Datei an ein Verzeichnis gebunden ist.