C#または他の.NET言語を使用して、ファイルパス文字列がローカルマシンにあるのかリモートサーバーにあるのかを判断するための最良の方法は何ですか?
以下を使用して、パス文字列がUNCであるかどうかを判別できます。
new Uri(path).IsUnc
これは、C:\または他のドライブ文字で始まるパスには最適ですが、次のようなパスについてはどうでしょうか。
\\machinename\sharename\directory
\\10.12.34.56\sharename\directory
...両方がローカルマシンを参照している場合-これらはUNCパスですが、それでもローカルです。
これを行うより効率的な方法があるかどうかはわかりませんが、私にとってはうまくいくようです:
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;
}
}
}
これが私がやった方法です。
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();
}
ホストが存在するかどうかを追加チェックした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));
}
以下は、マップされたドライブと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);
これが私が同様のニーズにどのように対処したかです。
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;
}
多分
var isLocal = Dns.GetHostName() == _Host || Dns.GetHostEntry(Dns.GetHostName()).AddressList.Any(i => i.ToString().Equals(_Host));
私はそれをチェックする単一の方法を知りません。ただし、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アドレスのいずれかに一致させます。