繁体   English   中英

检查网络驱动器上是否存在目录

[英]Check if directory exists on Network Drive

我正在尝试检测目录是否存在,但在这种特殊情况下,我的目录是网络位置。 我使用了VB.NET的My.Computer.FileSystem.DirectoryExists(PATH)和更通用的System.IO.Directory.Exists(PATH) ,在这两种情况下,系统响应都是false。 我检查了PATH,我可以在MyComputer文件夹中查看它。 如果我调试程序,并观察My.Computer.FileSystem.Drives变量,网络位置不会出现在该列表中。

更新:我检查并在Windows XP中响应为真,但在Windows 7中没有。

更新2:我测试了两个建议的解决方案,但我仍然遇到同样的问题,在下图中你会看到我可以使用资源管理器访问但我的程序不能。 GetUNCPath函数返回有效路径(无错误),但Directory.Exists stil返回false。

我还尝试使用UNC路径“\\\\ Server \\ Images”; 同样的结果。

在此输入图像描述

更新3:如果我无法与网络驱动器链接,我如何直接链接到UNC路径? 我发现如果我在正常模式下运行VS,它可以工作,但我的软件必须以管理员模式运行。 那么,有没有办法检查网络目录是否存在?

如果启用了UAC,则映射的网络驱动器仅在其映射的会话中“默认”存在:正常或已提升。 如果您从资源管理器映射网络驱动器,然后以管理员身份运行VS,驱动器将不在那里。

您需要启用MS调用“链接连接”:HKEY_LOCAL_MACHINE \\ Software \\ Microsoft \\ Windows \\ CurrentVersion \\ Policies \\ System:EnableLinkedConnections(REG_DWORD)= 0x1

有关与UAC“两次登录会话”的背景信息: http//support.microsoft.com/kb/937624/en-us

当您使用System.IO.Directory.Exists ,它只会让您知道它找不到该目录,但这可能是因为该目录实际上并不存在,或者因为该用户没有足够的访问权限。目录。

为了解决这个问题,我们在Directory.Exists之后添加了一个辅助测试,无法获得该目录缺席的真正原因,我们将其包装成一个全局方法,用于代替标准的Directory.Exists方法:

''' <summary>
''' This method tests to ensure that a directory actually does exist. If it does not, the reason for its 
''' absence will attempt to be determined and returned. The standard Directory.Exists does not raise 
''' any exceptions, which makes it impossible to determine why the request fails.
''' </summary>
''' <param name="sDirectory"></param>
''' <param name="sError"></param>
''' <param name="fActuallyDoesntExist">This is set to true when an error is not encountered while trying to verify the directory's existence. This means that 
''' we have access to the location the directory is supposed to be, but it simply doesn't exist. If this is false and the directory doesn't exist, then 
''' this means that an error, such as a security error, was encountered while trying to verify the directory's existence.</param>
Public Function DirectoryExists(ByVal sDirectory As String, ByRef sError As String, Optional ByRef fActuallyDoesntExist As Boolean = False) As Boolean
    ' Exceptions are partially handled by the caller

    If Not IO.Directory.Exists(sDirectory) Then
        Try
            Dim dtCreated As Date

            ' Attempt to retrieve the creation time for the directory. 
            ' This will usually throw an exception with the complaint (such as user logon failure)
            dtCreated = Directory.GetCreationTime(sDirectory)

            ' Indicate that the directory really doesn't exist
            fActuallyDoesntExist = True

            ' If an exception does not get thrown, the time that is returned is actually for the parent directory, 
            ' so there is no issue accessing the folder, it just doesn't exist.
            sError = "The directory does not exist"
        Catch theException As Exception
            ' Let the caller know the error that was encountered
            sError = theException.Message
        End Try

        Return False
    Else
        Return True
    End If
End Function
public static class MappedDriveResolver
    {
        [DllImport("mpr.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        public static extern int WNetGetConnection([MarshalAs(UnmanagedType.LPTStr)] string localName, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName, ref int length);
        public static string GetUNCPath(string originalPath)
        {
            StringBuilder sb = new StringBuilder(512);
            int size = sb.Capacity;

            // look for the {LETTER}: combination ...
            if (originalPath.Length > 2 && originalPath[1] == ':')
            {
                // don't use char.IsLetter here - as that can be misleading
                // the only valid drive letters are a-z && A-Z.
                char c = originalPath[0];
                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
                {
                    int error = WNetGetConnection(originalPath.Substring(0, 2), sb, ref size);
                    if (error == 0)
                    {
                        DirectoryInfo dir = new DirectoryInfo(originalPath);
                        string path = Path.GetFullPath(originalPath).Substring(Path.GetPathRoot(originalPath).Length);
                        return Path.Combine(sb.ToString().TrimEnd(), path);
                    }
                }
            }    
            return originalPath;
        }
    }

要使用它,请传入网络文件夹路径,转换为UNC文件夹路径并查看该文件夹是否存在:

File.Exists(MappedDriveResolver.GetUNCPath(filePath));

编辑:

我看到你的第二次编辑和唯一的区别(在我的Windows7中)当我查看网络驱动器时,我看到计算机>图像(\\\\ xyzServer) 你的电脑名称是Equipo吗? 是西班牙语的那支球队吗? 那是你的电脑吗? 我试图重现你的问题,但它对我有用:

在此输入图像描述

除此之外,我还需要对可能列出的网络共享进行“存在”检查,但该帐户没有访问权限,因此Directory.Exists将返回False。

发布的各种解决方案对我不起作用,所以这是我自己的:

public static bool DirectoryVisible(string path)
{
    try
    {
        Directory.GetAccessControl(path);
        return true;
    }
    catch (UnauthorizedAccessException)
    {
        return true;
    }
    catch
    {
        return false;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM