1

在我的本地计算机上,我创建了D:/指向\\MyComputerName\D.

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

然后我开始Windows PowerShell ISE。我的工作目录是C:\Users\username

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

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

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

然后我删除其中的Foo文件夹D:/并使用管理员权限启动 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:\Foo\Bar'.'

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

4

2 回答 2

1

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

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

# 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运行,则解决方案是将net use调用放在$PROFILE文件中。

于 2020-01-23T14:34:51.557 回答
0

您可以首先检查是否可以使用Directory.exists(string path)到达 D 驱动器。如果找不到,将无法创建目录。也许某处缺少权限。

于 2020-01-23T13:40:15.793 回答