使用 System.IO.Directory.CreateDirectory 在网络驱动器中创建一个文件夹 [重复]

Posted

技术标签:

【中文标题】使用 System.IO.Directory.CreateDirectory 在网络驱动器中创建一个文件夹 [重复]【英文标题】:Create a folder within a network drive with System.IO.Directory.CreateDirectory [duplicate] 【发布时间】:2020-05-09 19:10:24 【问题描述】:

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

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

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

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

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

目录Foo及其子文件夹Bar将创建成功。

然后我删除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:\Foo\Bar'.'

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

【问题讨论】:

【参考方案1】:

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

您可以如下验证:

# 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 文件中。

【讨论】:

非常感谢您的解释。我以 管理员权限启动了命令提示符,并首先使用 net use D: /del 删除了我的网络驱动器 D。之后,我再次使用net use D: "\\%COMPUTERNAME%\D 创建了网络驱动器D,然后我上面的简单控制台应用程序成功创建了文件夹Foo,其子文件夹Bar 在网络驱动器D 中! :-) 我也有同样的问题。当我在调试时运行我的应用程序时,它会创建 om 文件夹网络 ok。但是当我将它部署到 IIS 时出现错误:找不到路径的一部分你知道为什么吗?【参考方案2】:

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

【讨论】:

感谢您的提示。当然,这是一个合理的检查,不会遇到System.IO.DirectoryNotFoundException。但是在上面的示例中,我应该怎么做才能写入网络驱动器。我刚刚将C 驱动器的安全选项卡中的权限与我的网络驱动器D 的安全选项卡中的权限进行了比较。我看到组 Authenticated UsersUsers 和用户 SYSTEM 错过了。我将它们添加到网络驱动器D 的安全选项卡上,并授予它们全部访问权限。但问题仍然与我的问题中描述的相同。 另外,我将用户 Everyone 添加到网络驱动器 D 上的安全选项卡中,但没有成功。 但是试试看,这样你就会知道你是否真的可以从你的应用程序访问 D 驱动器。如果它不起作用,那么其他地方就有问题。

以上是关于使用 System.IO.Directory.CreateDirectory 在网络驱动器中创建一个文件夹 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)