0 Pluspunkte 0 Minuspunkte

Ich habe einen Fileserver Share Pfad z.B 

\\fileserver\gbi

Der Pfad auf der Festplatte ist dabei 

E:\Shares\GBI

ist also ein Unterordner der 2. Ebene. Wenn ich jetzt alle Ordner durchlaufe und z.B im Ordner

\\fileserver\gbi\berechtigungsaudit

bin. Wie bekomme ich die Ordnertiefe in C# abzüglich dem Sharepfad? Also nicht 

E:\Shares\GBI\Berechtigungsaudit

sondern

\\fileserver\gbi\berechtigungsaudit
von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Du kannst die Anzahl der Verzeichnistrenner (Path.DirectorySeparatorChar) zählen.

using System;
using System.IO;

class Program
{

    static void Main()
    {

        // Beispiel Share-Pfad
        string sharePath = @"\\fileserver\gbi";

        // Beispiel aktueller Pfad
        string currentPath = @"\\fileserver\gbi\berechtigungsaudit";

        // Ordnertiefe berechnen
        int depth = GetFolderDepth(sharePath, currentPath);

        Console.WriteLine($"Ordnertiefe abzüglich Sharepfad: {depth}");

    }

    static int GetFolderDepth(string sharePath, string currentPath)
    {

        // Normalisieren der Pfade für Vergleich
        sharePath = Path.GetFullPath(sharePath.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar);

        currentPath = Path.GetFullPath(currentPath.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar);

        if (!currentPath.StartsWith(sharePath, StringComparison.OrdinalIgnoreCase))
        {

            throw new ArgumentException("Der aktuelle Pfad liegt nicht innerhalb des Share-Pfads.");

        }

        // Relativen Pfad ermitteln
        string relativePath = currentPath.Substring(sharePath.Length);

        // Ordnertiefe berechnen
        return relativePath.Split(Path.DirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries).Length;

    }

}
von (868 Punkte)  
Dabei kommt diese Fehlermeldung:

Unhandled exception. System.ArgumentException: Der aktuelle Pfad liegt nicht innerhalb des Share-Pfads.
   at Program.GetFolderDepth(String sharePath, String currentPath)
   at Program.Main()
Command terminated by signal 6

Der Pfad liegt aber innerhalb!
Das Problem könnte sein, dass in UNC-Pfaden (\\server\share) Unterschiede in der Groß- Kleinschreibung oder zusätzliche Backslashes am Ende auftreten.

using System;
using System.IO;

class Program
{
    static void Main()
    {
        // Beispiel Share-Pfad
        string sharePath = @"\\fileserver\gbi";

        // Beispiel aktueller Pfad
        string currentPath = @"\\fileserver\gbi\berechtigungsaudit";

        try
        {
            // Ordnertiefe berechnen
            int depth = GetFolderDepth(sharePath, currentPath);

            Console.WriteLine($"Ordnertiefe abzüglich Sharepfad: {depth}");
        }
        catch (ArgumentException ex)
        {
            Console.WriteLine($"Fehler: {ex.Message}");
        }
    }

    static int GetFolderDepth(string sharePath, string currentPath)
    {
        // Normalisieren der Pfade für Vergleich
        string normalizedSharePath = Path.GetFullPath(sharePath.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar)
                                        .ToLowerInvariant();
        string normalizedCurrentPath = Path.GetFullPath(currentPath.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar)
                                          .ToLowerInvariant();

        // Debugging: Zeige normalisierte Pfade an
        Console.WriteLine($"Normalisierter Share-Pfad: {normalizedSharePath}");
        Console.WriteLine($"Normalisierter aktueller Pfad: {normalizedCurrentPath}");

        // Prüfen, ob der aktuelle Pfad innerhalb des Share-Pfads liegt
        if (!normalizedCurrentPath.StartsWith(normalizedSharePath))
        {
            throw new ArgumentException("Der aktuelle Pfad liegt nicht innerhalb des Share-Pfads.");
        }

        // Relativen Pfad ermitteln
        string relativePath = normalizedCurrentPath.Substring(normalizedSharePath.Length);

        // Ordnertiefe berechnen
        return relativePath.Split(Path.DirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries).Length;
    }
}
Trotzdem steht das der Pfad außerhalb liegt.

Normalisierter Share-Pfad: /app/\\fileserver\gbi/
Normalisierter aktueller Pfad: /app/\\fileserver\gbi\berechtigungsaudit/
Fehler: Der aktuelle Pfad liegt nicht innerhalb des Share-Pfads.
Die Ausgabe zeigt, dass die Pfadnormalisierung auf einem UNIX-ähnlichen Dateisystem läuft, was zu einer falschen Interpretation der Pfade führt. Offensichtlich werden die Backslashes (\) nicht korrekt behandelt und in / umgewandelt.

Das Problem liegt darin, dass Path.GetFullPath in Ihrer Umgebung den Pfad relativ zur aktuellen Arbeitsumgebung interpretiert. Wenn Sie auf einer Plattform wie Linux/Unix arbeiten (z. B. unter .NET Core auf Docker), funktioniert Path.GetFullPath nicht korrekt mit UNC-Pfaden.

Hier ist eine plattformunabhängige Lösung, die explizit mit UNC-Pfaden arbeitet, ohne sich auf die Standard-Dateipfadmethoden zu verlassen.

using System;

class Program
{
    static void Main()
    {
        // Beispiel Share-Pfad
        string sharePath = @"\\fileserver\gbi";

        // Beispiel aktueller Pfad
        string currentPath = @"\\fileserver\gbi\berechtigungsaudit";

        try
        {
            // Ordnertiefe berechnen
            int depth = GetFolderDepth(sharePath, currentPath);

            Console.WriteLine($"Ordnertiefe abzüglich Sharepfad: {depth}");
        }
        catch (ArgumentException ex)
        {
            Console.WriteLine($"Fehler: {ex.Message}");
        }
    }

    static int GetFolderDepth(string sharePath, string currentPath)
    {
        // Normalisieren der Pfade: Entfernen überflüssiger Backslashes und Vereinheitlichung
        string normalizedSharePath = NormalizeUNCPath(sharePath);
        string normalizedCurrentPath = NormalizeUNCPath(currentPath);

        // Debugging: Zeige normalisierte Pfade an
        Console.WriteLine($"Normalisierter Share-Pfad: {normalizedSharePath}");
        Console.WriteLine($"Normalisierter aktueller Pfad: {normalizedCurrentPath}");

        // Prüfen, ob der aktuelle Pfad innerhalb des Share-Pfads liegt
        if (!normalizedCurrentPath.StartsWith(normalizedSharePath))
        {
            throw new ArgumentException("Der aktuelle Pfad liegt nicht innerhalb des Share-Pfads.");
        }

        // Relativen Pfad ermitteln
        string relativePath = normalizedCurrentPath.Substring(normalizedSharePath.Length).TrimStart('\\');

        // Ordnertiefe berechnen
        return relativePath.Split('\\', StringSplitOptions.RemoveEmptyEntries).Length;
    }

    static string NormalizeUNCPath(string path)
    {
        // Trimme Leerzeichen und entferne abschließende Backslashes
        return path.Trim().TrimEnd('\\') + '\\';
    }
}
Danke, jetzt funktioniert das.