2011-12-25 10 views
7

Cerchiamo di accedere a una directory che è all'interno di una directory di rete, ma ottenere risultati errati (C#/Windows):Come forzare Windows per riconnettersi a un'unità di rete

var exists = Directory.Exists("Z:\\Sessions\\Data1"); 

"Z" è la directory di rete, " Sessioni "è una directory in cui un software di registrazione crea costantemente directory (ad esempio" Dati1 ") e inserisce alcuni dati in essa. Sembra che Windows memorizzi nella cache lo stato errato di Data1: Il metodo restituisce false. Ma quando accedo alla directory tramite Explorer, è qui. Quando eseguo il metodo (Directory.Exists) dopo aver effettuato l'accesso alla directory con Explorer, restituisce true. Naturalmente posso garantire che la directory esista effettivamente al primo tentativo.

Qual è il motivo di questo comportamento? Cosa posso fare a riguardo?

Modifica: Sembra che Windows non sia in grado di connettere l'unità di rete al computer remoto. Quando provo a navigare nella directory con Explorer, tenta automaticamente di connettere l'unità.

Quindi la domanda cambia: C'è un modo per forzare Windows per provare a riconnettersi tramite .NET?

Soluzione: Reconnecting a disconnected network drive

+0

Se si accede alla directory con il comando 'DIR' dal prompt dei comandi, si ottiene l'informazione corretta? Cioè: 'dir Z: \ Sessioni \ Dati1'. –

+0

No, l'accesso alla directory tramite prompt dei comandi non aggiorna la connessione dell'unità di rete. Si prega di vedere il mio edit ... – nepa

risposta

0

Qual è il motivo di questo comportamento?

Citazione dal documentation:

Se non si dispone di almeno autorizzazione di sola lettura alla directory, esistono imposta metodo restituirà false.


Cosa posso fare?

Verificare che si esegua l'applicazione .NET con un account che disponga almeno dell'autorizzazione di sola lettura per accedere a questa cartella. Nota che se stai scrivendo questo in un'applicazione ASP.NET probabilmente non sarà così, a seconda di quale account hai configurato il tuo server web per eseguire la tua applicazione, prendi le misure necessarie per concedere le autorizzazioni a questo account.

+0

come indicato dall'OP, "Quando eseguo il metodo (Directory.Exists) dopo aver effettuato l'accesso alla directory con Explorer, restituisce true." - Ciò significa che molto probabilmente è un problema di cache piuttosto che di permessi –

+1

@ EugeneMayevski'EldoSCorp, quando usi l'Explorer lo stai eseguendo sotto il tuo account. Quando si esegue un'applicazione ASP.NET, potrebbe essere eseguita con un account completamente diverso. Quindi immagino che il test eseguito dall'OP per verificare che la directory esista non sia stato eseguito a condizioni uguali: nel primo caso ha usato il proprio account mentre nel secondo qualche altro account è utilizzato (potremmo solo indovinare quale in questa fase l'OP ha fornito esattamente 0 contesto sulla sua applicazione). –

+0

La domanda è cambiata a causa di alcune mie scoperte, per favore vedi le mie modifiche. – nepa

2

Anche io uso un'unità remota e ci vogliono alcuni secondi per connettersi, quindi aspetto e lavoro ogni volta. Se non si connette, invierà un'e-mail e la controllerò.

 logger.Info("Create Z: drive "); 
     System.Diagnostics.Process process = new System.Diagnostics.Process(); 
     System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
     startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     startInfo.FileName = "cmd.exe"; 
     startInfo.Arguments = @"/C net use z: \\" + Tools.servername + @"\SHARE_NAME_HERE /user:USER_NAME_HERE PASSWORD_HERE"; 
     process.StartInfo = startInfo; 
     process.Start(); 
     logger.Info("Z: drive created "); 

     // wait get Z: 
     int xtimestimeout = 5; 
     while (!Directory.Exists(@"Z:\") & (xtimestimeout > 0)) 
     { 
      Application.DoEvents(); 
      SetBalloonTip(@"Program", @"connecting... please wait"); 
      ShowBalloon(); 
      logger.Info("Creating Z:... waiting..."); 
      Application.DoEvents(); 
      System.Threading.Thread.Sleep(3000); 
      xtimestimeout -= 1; 
     } 

     // check for sucessfull creation of Z: in server Z:\somedirectory 
     if (!Directory.Exists(@"Z:\")) 
     { 
      SendEmail2("Oh my... help!", "drive Z: not created <<< CHECK!"); 
      logger.Info("Z: email sent because of not created"); 
     } 
     logger.Info("Z: drive created successfully."); 
+0

Bene, qualcuno contrassegna la mia risposta con -1. Non capisco PERCHÉ perché anch'io ho la stessa situazione della domanda e questo codice lo risolve. Questo codice funziona e utilizza solo il codice .net, non la libreria esterna come risposta che è stata contrassegnata come soluzione. –

+0

Non ti preoccupare, ho contro votato. È in realtà una buona soluzione, esattamente quello che sto cercando di fare. Ma non voglio neanche che compaia la finestra di cmd. Tuttavia, non ho testato il tuo codice, ma sembra promettente. Grazie. – xmen

1

non sono sicuro quale versione di Mpr.dll link soluzione di cui sopra funziona con, ma io sto usando Win7 e hanno una versione leggermente diversa (anche se simile). Questo punto di ingresso è:

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

poi:

IntPtr hWnd = new IntPtr(0); 
int res = WNetRestoreSingleConnection(hWnd, <your drive path>, false); 

Dovrete aggiungere la tua controllo degli errori/movimentazione.

Problemi correlati