【问题标题】:How do I determine whether a given path string could represent a drive in the current environment?如何确定给定的路径字符串是否可以代表当前环境中的驱动器?
【发布时间】:2019-03-14 07:40:19
【问题描述】:

我正在处理可能在 .NET 或 Mono 上运行的 C# 代码中的文件和目录路径字符串。

我想确定给定的路径字符串是否可以是驱动器(无论当前系统上是否存在映射到该路径的实际驱动器)。

例如,考虑字符串"m:"。在某些环境(例如 Windows)中,这表示一个驱动器,而在其他环境中,它可能是一个常用的目录名称。

除非我想对操作系统的检查进行硬编码1我怎样才能发现(wlog)"m:" 表示 Windows 中的驱动器(最好甚至找到这个驱动器实际上叫"m")?

1:显然,这种检查注定会失败。

【问题讨论】:

  • DriveInfo 可能会有所帮助。
  • @Filburt:这看起来很有希望。我没有考虑过那个类,因为在文档中它确实不能用于不存在的驱动器。我将不得不检查该方法在 Linux 系统上的具体作用。
  • @Filburt:不幸的是,如果驱动器不存在,Mono's DriveInfo implementation 似乎会抛出一个ArgumentException。虽然这与 .NET 的做法相反,但 docs 足够模糊(“driveName 不指代有效的驱动器”,没有任何说明“有效”是指“理论上有效作为标识符”还是“具体存在于当前系统上") 以允许这种解释。
  • 我已经怀疑这可能会导致异常驱动的程序流,这当然是不可取的。
  • @Filburt:如果它允许异常驱动的程序流就好了,但正如我所描述的,Mono 的行为甚至不允许这样做。

标签: c# .net path mono


【解决方案1】:

Directory.Exists(String) MethodPath.GetPathRoot Method 的组合怎么样?

string drive = Path.GetPathRoot(FileLocation.Text);   // e.g. K:\

if (!Directory.Exists(drive))
{
     MessageBox.Show("Drive " + drive + " not found or inaccessible", 
                     "Error", MessageBoxButton.OK);
     return;
}

【讨论】:

  • 我必须检查GetPathRoot 在 Linux 上运行时的行为。不过,我不确定Directory.Exists 调用应该在这里实现什么,因为它似乎与我所要求的相反(“不管当前系统上是否有映射到该路径的实际驱动器")。
  • @F-H 在 Linux 上你会遇到困难,因为驱动器可以安装在几乎任何路径上。
  • 不确定这如何造成“困难时期”。我想象的函数只为在 Linux 上成为有效目录名称的任何字符串返回 true,而在 Windows 上它只为 m:m 之类的字符串返回 true
猜你喜欢
  • 2011-06-30
  • 1970-01-01
  • 2011-04-22
  • 2010-09-14
  • 2011-10-15
  • 2022-12-15
  • 1970-01-01
  • 2016-03-10
  • 2021-12-06
相关资源
最近更新 更多