web-dev-qa-db-ja.com

パス文字列がローカルマシンかリモートマシンかを判断する方法

C#または他の.NET言語を使用して、ファイルパス文字列がローカルマシンにあるのかリモートサーバーにあるのかを判断するための最良の方法は何ですか?

以下を使用して、パス文字列がUNCであるかどうかを判別できます。

new Uri(path).IsUnc

これは、C:\または他のドライブ文字で始まるパスには最適ですが、次のようなパスについてはどうでしょうか。

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

...両方がローカルマシンを参照している場合-これらはUNCパスですが、それでもローカルです。

34
David Boike

これを行うより効率的な方法があるかどうかはわかりませんが、私にとってはうまくいくようです:

    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;
            }
        }
    }
17

これが私がやった方法です。

    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();
    }
21
Renato Heeb

ホストが存在するかどうかを追加チェックしたEricの回答の.NET3.5バージョン:

    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));
    }
12
David

以下は、マップされたドライブと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);
7
Stephen

これが私が同様のニーズにどのように対処したかです。

        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;
    }
5
Art

多分

var isLocal = Dns.GetHostName() == _Host || Dns.GetHostEntry(Dns.GetHostName()).AddressList.Any(i => i.ToString().Equals(_Host));
0
user1471935

私はそれをチェックする単一の方法を知りません。ただし、UriのHostプロパティをローカルホスト名またはIPアドレスと比較することはできます。

次を使用してローカルマシン名を取得できます。

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

次に、その文字列を次の宛先に渡すことで、IPアドレスの配列を取得できます。

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

UriのHostNameTypeプロパティ(おそらくUriHostNameType.DnsまたはUriHostNameType.IPv4)をオンにして、名前またはIPアドレスのいずれかに一致させます。

0
tbetts42