如何强制Windows重新连接到网络驱动器

nep*_*epa 10 .net c# windows networking

我们尝试访问网络目录中的目录但得到错误的结果(C#/ Windows):

var exists = Directory.Exists("Z:\\Sessions\\Data1");
Run Code Online (Sandbox Code Playgroud)

"Z"是网络目录,"Sessions"是记录软件不断创建目录(例如"Data1")并在其中放入一些数据的目录.似乎Windows缓存了关于Data1的错误状态:该方法返回false.但是当我通过资源管理器访问目录时,它就在这里.在使用Explorer访问目录后运行方法(Directory.Exists)时,它返回true.当然,我可以保证目录在第一次尝试时实际存在.

这种行为的原因是什么?我能做些什么呢?

编辑: 似乎Windows无法将网络驱动器连接到远程计算机.当我尝试使用资源管理器导航到目录时,它会自动尝试连接驱动器.

所以问题发生了变化: 是否有办法强制Windows尝试通过.NET重新连接?

解决方案: 重新连接断开的网络驱动器

Jes*_*ess 5

我不确定上面的解决方案链接适用于哪个版本的mpr.dll,但我使用的是Win7,并且版本略有不同(尽管类似)。该入口点是:

    [DllImport("mpr.dll", SetLastError = true, EntryPoint = "WNetRestoreSingleConnectionW", CharSet = CharSet.Unicode)]
    internal static extern int WNetRestoreSingleConnection( IntPtr windowHandle,
                                                            [MarshalAs(UnmanagedType.LPWStr)] string localDrive,
                                                            [MarshalAs(UnmanagedType.Bool)] bool useUI);
Run Code Online (Sandbox Code Playgroud)

然后:

IntPtr hWnd = new IntPtr(0);
int res = WNetRestoreSingleConnection(hWnd, <your drive path>, false);
Run Code Online (Sandbox Code Playgroud)

您必须添加自己的错误检查/处理。


Dar*_*rov 0

这种行为的原因是什么?

引用文档

如果您不具备该目录的最低只读权限,Exists 方法将返回 false。


我能做什么呢?

确保您在至少具有访问此文件夹的只读权限的帐户下运行 .NET 应用程序。请注意,如果您在 ASP.NET 应用程序中编写此内容,则情况可能并非如此,因此根据您配置 Web 服务器以在哪个帐户下执行应用程序,请采取必要的步骤向该帐户授予权限。