使用 System.IO.Directory.CreateDirectory 在网络驱动器内创建一个文件夹



在我的本地计算机上,我创建了指向\MyComputerNameD的网络驱动器D:/

在本地磁盘C:/上,我创建了一个名为D的文件夹,并配置了一个网络共享,该共享具有该共享上每个人的权限。

然后我开始Windows PowerShell ISE.我的工作目录是C:Usersusername

之后,我在此网络驱动器中创建了一个带有Powershell的文件夹,例如

[System.IO.Directory]::CreateDirectory("D:/Foo/Bar")

将成功创建包含其子文件夹Bar的目录Foo

然后,我删除了D:/中的Foo文件夹,并使用管理员权限启动Visual Studio 2019。

然后,我创建一个简单的 C#.NET 控制台应用程序,例如

class Program
{
static void Main(string[] args)
{
System.IO.Directory.CreateDirectory(@"D:/Foo/Bar");
}
}

如果我运行控制台应用程序,将不会创建目录,并且会得到System.IO.DirectoryNotFoundException: 'Could not find a part of the path 'D:FooBar'.'

我应该怎么做才能使用简单的控制台应用程序成功创建文件夹?

从根本上说,如果使用提升运行进程(以管理员身份(,则它不会看到您在提升运行时建立的驱动器映射。

您可以按如下方式验证这一点:

# Establish a (temporary) mapping; making it persistent makes no difference.
# Note: This assumes that the admin shares are turned on.
net use T: "\$(hostname)c$Users"
# Start a new PowerShell process *elevated* (as admin)
# You'll see that it can't find drive T:
Start-Process -Verb Runas powershell '-noprofile -c Get-ChildItem T:; pause'
# Clean up
net use T: /del

最简单的解决方法是直接使用UNC 路径创建文件夹。

如果您不想将其硬编码到应用程序中,或者不想事先为提升的化身重新创建映射,则必须找到其他方式将驱动器映射信息从非提升的化身传达到提升的化身。

如果需要查看映射驱动器的所有代码都通过 PowerShell运行,则解决方案是在$PROFILE文件中发出net use调用。

您可以从检查是否可以使用 Directory.exists(字符串路径(访问 D 驱动器开始。如果找不到它,您将无法创建目录。也许某处缺少权限。

最新更新