【问题标题】:C#: path format such as \\.\c:\ or \\DOMAIN\c:\ not supportedC#:不支持 \\.\c:\ 或 \\DOMAIN\c:\ 等路径格式
【发布时间】:2017-12-23 03:33:39
【问题描述】:

我试图删除一个文件夹,其中一个子文件夹的名称为“con”,这是一个保留的设备名称,因此 C# 会引发异常。

在 CMD 中,我可以使用 rmdir \\.\c:\con 删除这样的文件夹,但在 C# 中,我尝试了很多变体,但总是发现路径格式不受支持。例如,以下内容不起作用:Directory.Delete("\\\\" + Environment.UserDomainName + "\\c:\\test")

请注意,我不想依赖外部命令,例如 CMD 的del 命令等。

【问题讨论】:

  • 使用 Environment.GetFolderPath(Environment.SpecialFolder.MyComputer) + @"c:\test"
  • @Polly 它适用于普通文件夹名称,如“test”,但我正在尝试删除名称为“con、com4”等的文件夹。女巫在 windows 中被阻止,使用您的代码抛出异常以删除 c:\con
    请在 cmd 中运行 {mkdir \\.\c:\con } 并尝试通过 c#
    删除它
  • 好的,您可以调用隐藏的终端窗口并从那里使用“rmdir \\.\c:con”作为变体
  • 正如我所说,我不想依赖 emdir.exe 或等。感谢您的帮助
  • 仅供参考,“\\Domain\c:\test”无效。使用重定向器时,隐藏的驱动器共享为“C$”,例如“\\域\C$\test”。诸如“\\?\C:\test”或“\\.\C:\test”之类的路径是本地设备路径,而不是 UNC 网络共享。底层实现完全不同。 UNC 路径实际上最终会使用 UNC 设备转换为“\\?\UNC\server\share\...”,该设备是当今 MUP 设备的链接。

标签: c# windows file


【解决方案1】:

您必须绕过 .net 框架并使用 \\?\c:\con 表示法和 p/invoke 到 RemoveDirectory 调用来删除文件

[DllImport("kernel32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
static extern bool RemoveDirectory(string lpPathName);

public static DeleteBadDir()
{
     RemoveDirectory(@"\\?\c:\con");
}

【讨论】:

  • 我想过这个,但是当这个函数的 msdn 中的文件夹不为空时,这不应该工作目录必须为空
  • pinvoke.net 上有一个递归示例,它也删除了文件夹的内容。
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2017-12-12
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
相关资源
最近更新 更多