如何通过 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 的 DriverInfoDriverType = 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 文本,三位大佬提供的方案很全面,学习了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交换系统接媒体服务器,基于软交换的媒体服务器的设计与实现

摘要:随着VoIP(Voice over Internet Protocol,俗称网络电话)的迅速发展,单纯的语音业务已经无法满足用户和市场的需求,因此一种具有多媒体业务的VoIP的方案——IP媒体服务器因此产生了。它可以提供更具个性化和差异性的增值业务,而且可以为提供商带来更高的利润。国…

Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)

http://www.cnblogs.com/salam/archive/2010/11/30/1892143.html转载于:https://www.cnblogs.com/cliffhuang/p/3708696.html

web服务器的基本应用

WEB服务器也称为WWW(WORLD WIDE WEB)即是所谓的万维网服务器,主要功能是提供网上信息浏览服务。 最常用的大型Web服务器是Apache和微软的Internet信息服务器(Internet Information Server,所谓的IIS服务器)、IBM WebSphere以及BE…

Android 之PackageManager框架

http://blog.csdn.net/stonecao/article/details/6591454 1.接着前面讲的ActivityManager框架,继续说一下系统另一个重要的框架,PackagerManager 同样先看一下静态类结构图: 大部分情况我们是在Activity中使用getPackageManager方法获取一个…

有一个会泰勒级数的八岁表妹是怎样一种体验?

全世界只有3.14 % 的人关注了爆炸吧知识上一篇文章超模君给大家介绍了欧拉公式,很多粉丝问我:八岁表妹明明还是小学生,是怎么知道泰勒级数的意思的?答案其实很简单,这当然和我们全家优秀的基因...不!优良的家教有关&a…

限流中间件IpRateLimitMiddleware的使用

前言IpRateLimitMiddleware(Github: AspNetCoreRateLimit) 是ASPNETCore的一个限流的中间件,用于控制客户端调用API的频次, 如果客户端频繁访问服务器,可以限制它的频率,已降低访问服务器端的压力。或者如果…

对抗告警疲劳的8种方法

【编者按】本文作者为 Chris Riley,主要介绍告警疲劳的产生原因与对抗告警疲劳的8种方法。文章系国内 ITOM 管理平台 OneAPM 编译呈现。 各司其职、孤军作战非常不利于团队沟通,一旦发生重大事件,各个部门就很难掌握事件始末,这不…

EL表达式

一、EL简介 1.语法结构 ${expression}2.[]与.运算符 EL 提供.和[]两种运算符来存取数据。 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。例如: ${user.My-Name}应当改为${user["My-Name&quo…

制作Geek风格的投影片

做投影片用什么?如果你的回答是用PowerPoint,有没有感觉弱爆了?好吧,也许你会说用开源的替代,比如openOffice/Libreoffice。当然其实本质都是一样的,那就是PPT!从今天开始不要再说、再用 PPT这三…

Activity之launchMode:singleTop,singleTask与singleInstance

相关内容,可以参见官方网址: http://developer.android.com/guide/components/tasks-and-back-stack.html 如图所示,如果ABC三个Activity的launchMode都是standard,那么按照图示顺序调用后,堆栈为ABCBB; …

傅立叶变换是如何改变我们生活的? ——四个角度告诉你答案

全世界只有3.14 % 的人关注了爆炸吧知识引子:尽管没有微积分那样如雷贯耳的名声,也没有相对论那般独辟蹊径的创新,傅立叶变换却悄悄地潜藏在我们生活中的方方面面,默默地改变着这个世界。对于工科出身的读者而言,傅立叶…

Win11新版右键菜单用不惯?一键切换回Win10经典版!

在 Windows 11 操作系统中,微软对文件资源管理器和应用程序的上下文菜单(Context Menu,俗称“右键菜单”)进行了现代化改造。Windows 11 新版右键菜单更加简约,并且融入圆角设计,将常用的命令剪切、复制、粘…

Careercup - Google面试题 - 4877486110277632

2014-05-08 05:16 题目链接 原题: Given a circle with N defined points and a point M outside the circle, find the point that is closest to M among the set of N. O(LogN) 题目:给定一个圆上的N个点,和一个在这个圆外部的点。请找出这…

Android之adb shell dumpsys activity获取task里面的所有actitiy

android 如何在开启一个activity的时候清除所有前面的Activity intent intent new Intent();intent.addFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent); 在控制台输入: db shell dumpsys activity获取task里面的所有activity 图片就不给了&#xff…

MySQL使用详解--根据个人学习总结

1.安装配置 2.启动mysql服务并配置 mysql> \s(status也行)查看当前服务器状态查看编码状态Server characterset : utf8Db characterset: utf8Client characterset: gbkConn. characterset: gbk修改:---进入配置文件my.ini客户端&#xff1…

送什么给女朋友最致命?

1 啊,原来里面有说明书(via.豆瓣哈组,侵删)▼2 网友给女朋友准备的惊喜(素材来源网络,侵删)▼3 这个泰国小哥的创意真棒(via.阿森不是妖怪,侵删)▼4 老婆的…

如何修改 匿名类型 中的属性值 ?

咨询区 Leo Vo我有下面一段代码:var output new {NetSessionId string.Empty };foreach (var property in output.GetType().GetProperties()) {property.SetValue(output, "Test", null); }代码运行后,它会抛出如下异常:Propert…

SWF反编译神器ASV2013功能展示(下)

动作脚本菜单动作脚本-查看元件类动作脚本-编辑AS3常量池动作脚本-ASV内部ABC数据浏览器窗口菜单 选项菜单-帧视图选项 选项菜单-预览窗口选项选项菜单-时间线视图选项选项菜单-库视图选项 选项菜单-动作脚本视图选项实用工具菜单 关于对话框 转载于:https://blog.51cto.com/as…

Andorid之taskAffinity 和 FLAG_ACTIVITY_NEW_TASK

taskAffinity 和 FLAG_ACTIVITY_NEW_TASK都是和activity启动时是否需要新建一个task有关,我们分四种情况看一下这两个标志对启动activity的影响:(前提:从MainActivity中启动ActivityA) 1)、两个标志都不设置 2)、有FLAG_ACTIVITY_NEW_TASK …

【项目 报错】 项目启动,内存溢出 可能出现的各种报错

内存溢出可能有如下的错误: 错误1: java.lang.OutOfMemoryError: PermGen space 错误2: Exception in thread "http-apr-8080-exec-2" 出现如上的错误,解决方法如下: 1.双击Tomcat 2.点击open launch config…