2013-07-04 20 views
20

Dizinin var olup olmadığını algılamaya çalışıyorum ancak bu durumda dizinim bir ağ konumudur. VB.NET'in My.Computer.FileSystem.DirectoryExists(PATH) ve daha genel System.IO.Directory.Exists(PATH) kullandım ve her iki durumda da sistem yanıtı yanlış. Kontrol ettim ve PATH var, Bilgisayarım Klasöründe görüntüleyebiliyorum. Programı hata ayıklar ve My.Computer.FileSystem.Drives değişkenini izlerseniz, ağ konumu bu listede görünmez.Ağ Sürücüsünde dizinin var olup olmadığını kontrol edin

GÜNCELLEME: kontrol ettim ve Windows XP Tepki Doğru, ancak Windows 7'de

Update2 içinde: ben hem önerilen çözümler test ama hala aşağıdaki resmi, aynı sorun var Explorer kullanarak erişebileceğimi göreceksiniz ama programım yapamıyor. GetUNCPath işlevi geçerli bir yol döndürür (hata yok), ancak Directory.Exists stil yanlış döndürür.

Ayrıca UNC yolu "\\ Server \ Images" ile denedim; aynı sonuç.

enter image description here

Update3: Bir ağ sürücüsü ile bağlayamazsınız, nasıl doğrudan UNC yoluna bağlayabilirsiniz ?. VS'yi normal modda çalıştırırsam çalışır, ancak yazılımımın yönetici modunda çalışması gerektiğini keşfettim. Yani, bir ağ dizininin varlığını yönetici olarak kontrol etmenin herhangi bir yolu var mı?

+0

geliyor. Programı yönetici olarak mı çalıştırıyorsunuz? – keyboardP

+0

Evet, Visual Studio'yu yönetici haklarıyla çalıştırıyorum. – Natalia

+0

Yolun beklenen biçimde tanımlı olduğunu anlıyorum, yani: \\ server_name \ folder \ file.this – varocarbas

cevap

12

, eşleştirilmiş ağ sürücüleri sadece eşleştirildikleri oturumda "varsayılan olarak" mevcuttur. Bir ağ sürücüsünü gezginden eşlerseniz, VS'yi yönetici olarak çalıştırın, sürücü orada olmayacaktır.

etkinleştirebilir gerekenler MS "bağlantılı bağlantıları" olarak adlandırdığı: Microsoft \ Windows \ HKEY_LOCAL_MACHINE \ Software \ CurrentVersion Policies \ System \: EnableLinkedConnections (REG_DWORD) = 0x1

"iki oturum açma oturumları" ile ilgili Temel Bilgiler UAC: http://support.microsoft.com/kb/937624/en-us

+0

VS normal hesabında çalıştırın ve mükemmel çalışıyor, HKEY_LOCAL_MACHINE üzerinde EnableLinkedConnections anahtarını oluşturdum, ancak yönetici modunda VS çalıştırdığımda hala hata alıyorum. – Natalia

+0

Bkz. Update3 lütfen – Natalia

+0

bekleyin, internete bakıyorum ve bilgisayarı yeniden başlatmam gerektiğini söylediler, bu yüzden önce bunu kontrol edeceğim. – Natalia

8

System.IO.Directory.Exists'u kullandığınızda, yalnızca dizini bulamadığını bilmenizi sağlar, ancak bunun nedeni dizinin gerçekte mevcut olmaması veya kullanıcının dizinde yeterli erişim haklarına sahip olmaması olabilir.

: Directory.Exists dizinin yokluğunda gerçek nedenini elde etmek başarısız olur ve biz standart Directory.Exists yöntemi yerine kullanılan bir küresel yöntem haline bu sarılmış sonra

bu sorunu çözmek için, biz ikincil testi eklemek klasör varsa
''' <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 
+0

dizinine girebilirdi. Update2 lütfen – Natalia

+0

@Natalia'ya bakın: Düşünebildiğim tek şey, uygulamanın düşündüğünüz kullanıcı olarak çalışmadığı ve dolayısıyla eşlenmiş sürücüyü almadığıdır. Bu kod ekleyerek exe'ın nasıl çalıştığını görebilirsiniz: Debug.WriteLine (System.Security.Principal.WindowsIdentity.GetCurrent(). Name) –

+0

Bu kod satırını yazdım ve uygulamayı çalıştıran kullanıcı benim kullanıcı. Bu kullanıcı yönetici. Bence sorun bu değil. – Natalia

5
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 klasör yolunu dönüştürmek ve bkz Ağ klasör yolu geçirmek, kullanmak için:

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

Düzenleme: Ben Bilgisayar> Görüntüleri (\\ xyzServer) bkz bir ağ sürücüsünü görüntülediğinizde

Ben senin ikinci düzenleme ve (benim Windows7) tek fark gördük. PC'nizin adı Equipo mu? Bu ispanyolca takım takım mı? PC'niz bu mu? Ben senin sorunu yeniden çalıştı ama benim için çalışıyor: Normal veya yüksek: UAC açıksa

enter image description here

+0

Bkz. Update2 lütfen – Natalia

+0

Evet, Bilgisayarım Adı "Equipo", Ben Arjantinliyim. Visual Studio'm neden Windows 7'deki ağ sürücüsünü tanımıyor bilmiyorum. Bu sorun beni çıldırtıyor. – Natalia

1

Buna ek olarak, listelenebilecek ağ paylaşımları üzerinde bir 'Varolanlar' denetimi yapmam gerekiyordu, ancak hesabın erişim izni yoktu, bu nedenle Directory.Exists False değerini döndürür. işte benim için işe yaramadı yayınlanmıştır

çeşitli çözümler kendi şudur: Bir UAC sorunu olabilir gibi

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