如何通过 C# 判断一个 路径 是本机还是远程 ?
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过 C# 判断一个 路径 是本机还是远程 ?相关的知识,希望对你有一定的参考价值。
咨询区
David Boike
请问在 C# 中是否有好的方式判断 path 是在本地还是在远程,我想到了用 UNC
属性来判断,比如下面的代码:
new Uri(path).IsUnc
但这代码也有一定的问题,它会误判下面的 path 格式。
\\\\machinename\\sharename\\directory
\\\\10.12.34.56\\sharename\\directory
上面这两种格式也是在本地,而不是远程。
回答区
Stephen
我是借助 Shlwapi.dll
这个 win32 api 来实现的,可以用它来判断当前的 path 来自于 drivers 还是 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);
Eric Rosenberger
可以通过 path 的 host 来判断当前是否为 回路地址
,我不知道这是否是最高效的解决方案,但适合我。
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;
Renato Heeb
我是通过 path 的 DriverInfo
的 DriverType = Network
来判断当前是否为远程。
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();
点评区
这场景我还真的遇到过,曾经给医院内网部署桌面程序时,需要读取局域网共享文件中的 txt
文本,三位大佬提供的方案很全面,学习了。
以上是关于如何通过 C# 判断一个 路径 是本机还是远程 ?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 C# 客户端 RPC 写入远程本机 C++ 服务器?