Подтвердить что ты не робот

Проверьте, существует ли каталог на сетевом диске

Я пытаюсь определить, существует ли каталог, но в этой конкретной ситуации мой каталог является сетевым местоположением. Я использовал VB.NET My.Computer.FileSystem.DirectoryExists(PATH) и более общий System.IO.Directory.Exists(PATH), и в обоих случаях системный отклик был ложным. Я проверил и PATH существует, я могу просмотреть его в папке MyComputer. Если я отлаживаю программу и наблюдаю за переменной My.Computer.FileSystem.Drives, сетевое расположение не отображается в этом списке.

UPDATE: Я проверил и в Windows XP ответ был правдой, но не в Windows 7.

UPDATE2: Я тестировал оба предложенных решения, но у меня по-прежнему есть одна и та же проблема. На изображении ниже вы увидите, что я могу получить доступ к Explorer, но моя программа не может. Функция GetUNCPath возвращает допустимый путь (без ошибок), но Directory.Exists stil возвращает false.

Я также пробовал путь UNC "\\ Server\Images"; тот же результат.

enter image description here

UPDATE3: Если я не могу подключиться к сетевому диску, как я могу напрямую связать его с UNC-каналом?. Я обнаружил, что если я запускаю VS в обычном режиме, он работает, но мое программное обеспечение должно работать в режиме администратора. Итак, есть ли способ проверить существование сетевого каталога как администратора?

4b9b3361

Ответ 1

Если UAC включен, подключенные сетевые диски только существуют "по умолчанию" в сеансе, который они отображаются: Normal или повышен. Если вы сопоставляете сетевой диск с проводником, затем запускаете VS в качестве администратора, диск там не будет.

Вам нужно включить то, что MS вызывает "связанные соединения": HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System: EnableLinkedConnections (REG_DWORD) = 0x1

Фоновая информация о "двух сеансах входа в систему" ​​с UAC: http://support.microsoft.com/kb/937624/en-us

Ответ 2

Когда вы используете 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 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 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

Ответ 3

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));

Edit:

Я видел ваше второе редактирование и единственное различие (в моем Windows7), когда я просматриваю сетевой диск, я вижу Компьютеp > Изображения (\\ xyzServer). Имя вашего ПК Equipo? это команда на испанском? это ваш ПК? Я попытался воспроизвести вашу проблему, но она работает для меня:

enter image description here

Ответ 4

Добавив к этому, мне нужно было сделать проверку "Exists" на сетевые ресурсы, которые могли бы быть указаны, но у учетной записи не было прав доступа, поэтому Directory.Exists вернет False.

Опубликованные различные решения не работали для меня, поэтому вот мои собственные:

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