2011-12-25 109 views
7

我們嘗試訪問的目錄是網絡目錄內,但得到錯誤的結果(C#/ Windows)中:如何強制Windows重新連接到網絡驅動器

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

「Z」是網絡目錄,「會話「是一個錄製軟件不斷創建目錄(例如」Data1「)並將一些數據放入其中的目錄。 看來,Windows緩存關於Data1的錯誤狀態:該方法返回false。但是當我通過資源管理器訪問目錄時,它就在這裏。當我用Explorer訪問目錄後運行方法(Directory.Exists)時,它返回true。當然,我可以保證該目錄在第一次嘗試時實際存在。

這種行爲的原因是什麼?我能做些什麼呢?

編輯: 看來,Windows無法將網絡驅動器連接到遠程計算機。當我嘗試使用Explorer瀏覽到目錄時,它會自動嘗試連接驅動器。

因此,問題變化: 有沒有辦法強制窗戶嘗試通過.NET重新連接?

解決方案: Reconnecting a disconnected network drive

+0

如果您使用命令提示符下的「DIR」命令訪問目錄,您是否收到正確的信息?那就是:'dir Z:\ Sessions \ Data1'。 – 2011-12-25 14:24:14

+0

不,通過命令提示符訪問目錄不會刷新網絡驅動器連接。請參閱我的編輯... – nepa 2011-12-26 10:20:54

回答

0

什麼是這種現象的原因?從documentation

報價:

如果沒有至少只讀權限的目錄, 有不存在的方法將返回false。


我能做些什麼呢?

確保您在一個至少具有隻讀權限的帳戶下運行.NET應用程序以訪問此文件夾。請注意,如果您正在ASP.NET應用程序中編寫此應用程序,則可能不會如此,具體取決於您將Web服務器配置爲在哪個帳戶下執行您的應用程序,請採取必要步驟爲該帳戶授予權限。

+0

作爲OP提到,「當我用Explorer訪問目錄後運行該方法(Directory.Exists)時,它返回true。」 - 這意味着最有可能是緩存問題,而不是權限 – 2011-12-25 13:28:03

+1

@ EugeneMayevski'EldoSCorp,當您使用資源管理器時,您正在您的帳戶下運行它。當您運行ASP.NET應用程序時,它可以在完全不同的帳戶下運行。所以我猜測OP爲驗證目錄存在而進行的測試並未在相同的條件下執行:在第一種情況下,他使用自己的帳戶,而在第二種情況下使用其他帳戶(我們只能猜測哪一個在這個階段,由於OP提供了關於他的申請的正確背景)。 – 2011-12-25 13:29:14

+0

由於我所做的一些發現,問題發生了變化,請參閱我的編輯。 – nepa 2011-12-26 10:22:07

2

我也使用遠程驅動器,它需要幾秒鐘的時間才能連接,所以我只是等待並且每次都工作。如果它沒有連接,它會發送一封電子郵件,我會檢查它。

 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

好吧,有人用-1標記我的答案。我不明白爲什麼,因爲我也和問題一樣,並且這個代碼解決了這個問題。此代碼的工作原理,只使用.net代碼,而不是外部庫作爲標記爲解決方案的答案。 – 2014-09-08 10:06:33

+0

別擔心,我反對票。它實際上是一個很好的解決方案,正是我想要做的。但我也不希望cmd窗口出現。但是,我沒有測試過你的代碼,但它看起來很有前途。謝謝。 – xmen 2015-06-08 06:01:06

1

我不知道這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); 

則:

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

你必須添加自己的錯誤檢查/處理。

相關問題