Μέθοδος για τον προσδιορισμό εάν συμβολοσειρά διαδρομή είναι τοπικό ή απομακρυσμένο μηχάνημα

ψήφοι
30

Ποιος είναι ο καλύτερος τρόπος, χρησιμοποιώντας C # ή άλλη γλώσσα .NET, για να καθοριστεί αν ένα string διαδρομή του αρχείου είναι στον τοπικό υπολογιστή ή έναν απομακρυσμένο διακομιστή;

Είναι δυνατό να καθοριστεί αν ένα string διαδρομή είναι UNC χρησιμοποιώντας τα ακόλουθα:

new Uri(path).IsUnc

Αυτό λειτουργεί μεγάλο για τα μονοπάτια που ξεκινούν με C: \ ή άλλο γράμμα μονάδας δίσκου, αλλά τι γίνεται με μονοπάτια, όπως:

\\machinename\sharename\directory
\\10.12.34.56\sharename\directory

... όπου οι δύο αναφέρονται στο τοπικό μηχάνημα - αυτά είναι διαδρομές UNC, αλλά εξακολουθούν να είναι τοπικές.

Δημοσιεύθηκε 09/12/2008 στις 23:26
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
21

Αυτό είναι το πώς το έκανα.

    public static bool IsLocal(DirectoryInfo dir)
    {
        foreach (DriveInfo d in DriveInfo.GetDrives())
        {
            if (string.Compare(dir.Root.FullName, d.Name, StringComparison.OrdinalIgnoreCase) == 0) //[drweb86] Fix for different case.
            {
                return (d.DriveType != DriveType.Network);
            }
        }
         throw new DriveNotFoundException();
    }
Απαντήθηκε 13/12/2010 στις 19:45
πηγή χρήστη

ψήφοι
15

Δεν ξέρω αν υπάρχει ένας πιο αποτελεσματικός τρόπος για να γίνει αυτό, αλλά φαίνεται να λειτουργεί για μένα:

    IPAddress[] host;
    IPAddress[] local;
    bool isLocal = false;

    host = Dns.GetHostAddresses(uri.Host);
    local = Dns.GetHostAddresses(Dns.GetHostName());

    foreach (IPAddress hostAddress in host)
    {
        if (IPAddress.IsLoopback(hostAddress))
        {
            isLocal = true;
            break;
        }
        else
        {
            foreach (IPAddress localAddress in local)
            {
                if (hostAddress.Equals(localAddress))
                {
                    isLocal = true;
                    break;
                }
            }

            if (isLocal)
            {
                break;
            }
        }
    }
Απαντήθηκε 10/12/2008 στις 00:12
πηγή χρήστη

ψήφοι
12

.NET 3.5 έκδοση της απάντησης του Eric με μια επιπλέον έλεγχος αν υπάρχει ο οικοδεσπότης:

    private bool IsLocalHost(string input)
    {
        IPAddress[] host;
        //get host addresses
        try { host = Dns.GetHostAddresses(input); }
        catch (Exception) { return false; }
        //get local adresses
        IPAddress[] local = Dns.GetHostAddresses(Dns.GetHostName()); 
        //check if local
        return host.Any(hostAddress => IPAddress.IsLoopback(hostAddress) || local.Contains(hostAddress));
    }
Απαντήθηκε 01/09/2011 στις 10:18
πηγή χρήστη

ψήφοι
6

Τα ακόλουθα θα πρέπει να εργαστεί για αντιστοιχισμένες μονάδες δίσκων και για διαδρομές UNC.

private static bool IsLocalPath(String path)
{
    if (!PathIsUNC(path))
    {
        return !PathIsNetworkPath(path);
    }

    Uri uri = new Uri(path);
    return IsLocalHost(uri.Host); // Refer to David's answer
}

[DllImport("Shlwapi.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PathIsNetworkPath(String pszPath);

[DllImport("Shlwapi.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PathIsUNC(String pszPath);
Απαντήθηκε 19/12/2013 στις 02:19
πηγή χρήστη

ψήφοι
5

Εδώ είναι το πώς θα αντιμετωπιστεί μια παρόμοια ανάγκη.

        internal static bool IsFileRemote(string path)
    {
            if (String.IsNullOrEmpty(path))
            {
                return false;
            }
            if (new Uri(path).IsUnc)
            {
                return true;
            }
            if (new DriveInfo(path).DriveType == DriveType.Network)
            {
                return true;
            }
            return false;
    }
Απαντήθηκε 19/02/2014 στις 17:08
πηγή χρήστη

ψήφοι
0

Μπορεί

var isLocal = Dns.GetHostName() == _host || Dns.GetHostEntry(Dns.GetHostName()).AddressList.Any(i => i.ToString().Equals(_host));
Απαντήθηκε 06/11/2013 στις 12:10
πηγή χρήστη

ψήφοι
0

Δεν ξέρω μιας ενιαίας μεθόδου για τον έλεγχο αυτό. Ωστόσο, μπορείτε να συγκρίνετε του Uri του Hostακινήτου είτε με το τοπικό όνομα του κεντρικού υπολογιστή ή τη διεύθυνση IP.

Μπορείτε να πάρετε το τοπικό όνομα του μηχανήματος, χρησιμοποιώντας:

string hostName = System.Net.Dns.GetHostName()

Στη συνέχεια μπορείτε να πάρετε μια σειρά από διευθύνσεις IP με το πέρασμα αυτό το string για να:

System.Net.IPAddress[] addresses = System.Net.Dns.GetHostAddresses(hostName);

Ενεργοποίηση του Uri του HostNameTypeακινήτου, κατά πάσα πιθανότητα UriHostNameType.Dnsή UriHostNameType.IPv4, για να ταιριάζει είτε το όνομα ή τη διεύθυνση IP.

Απαντήθηκε 10/12/2008 στις 00:00
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more