2011-12-25 35 views
7

Chúng tôi cố gắng truy cập vào một thư mục mà nằm trong một thư mục mạng nhưng có được kết quả sai (C#/Windows):Làm thế nào để buộc Windows để kết nối lại với ổ đĩa mạng

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

"Z" là thư mục mạng, " Phiên "là một thư mục mà phần mềm ghi liên tục tạo các thư mục (ví dụ" Dữ liệu1 ") và đặt một số dữ liệu trong đó. Dường như Windows lưu trữ trạng thái sai về Data1: Phương thức trả về false. Nhưng khi tôi truy cập vào thư mục thông qua Explorer, nó ở đây. Khi tôi chạy phương thức (Directory.Exists) sau khi truy cập thư mục với Explorer, nó trả về true. Tất nhiên tôi có thể đảm bảo rằng thư mục thực sự tồn tại trong lần thử đầu tiên.

Lý do của hành vi này là gì? Tôi có thể làm gì với nó?

Chỉnh sửa: Dường như các cửa sổ không thể kết nối ổ đĩa mạng với máy tính từ xa. Khi tôi cố gắng điều hướng vào thư mục với Explorer, nó sẽ tự động cố kết nối ổ đĩa.

Vì vậy, câu hỏi thay đổi: Có cách nào để buộc cửa sổ thử kết nối lại qua .NET không?

Giải pháp: Reconnecting a disconnected network drive

+0

Nếu bạn truy cập thư mục bằng lệnh 'DIR' từ dấu nhắc lệnh, bạn có nhận được thông tin chính xác không? Đó là: 'dir Z: \ Sessions \ Data1'. –

+0

Không, truy cập thư mục thông qua dấu nhắc lệnh không làm mới kết nối ổ đĩa mạng. Xin vui lòng xem chỉnh sửa của tôi ... – nepa

Trả lời

0

lý do cho hành vi này là gì?

Trích từ documentation:

Nếu bạn không có ở mức tối thiểu read-only phép vào thư mục, tồn tại phương pháp sẽ trả về false.


tôi có thể làm gì về nó?

Đảm bảo rằng bạn đang chạy ứng dụng .NET của mình trong tài khoản có ít nhất quyền chỉ đọc để truy cập thư mục này. Lưu ý rằng nếu bạn đang viết điều này trong một ứng dụng ASP.NET, điều này có thể sẽ không phải như vậy, tùy thuộc vào tài khoản bạn đã cấu hình máy chủ web của mình để thực thi ứng dụng của mình, thực hiện các bước cần thiết để cấp quyền cho tài khoản này.

+0

như OP đã đề cập, "Khi tôi chạy phương thức (Directory.Exists) sau khi truy cập thư mục với Explorer, nó trả về true" - điều đó có nghĩa là rất có thể đó là vấn đề về bộ nhớ đệm thay vì quyền –

+1

@ EugeneMayevski'EldoSCorp, khi bạn sử dụng Explorer bạn đang chạy nó trong tài khoản của bạn. Khi bạn đang chạy một ứng dụng ASP.NET, nó có thể chạy dưới một tài khoản hoàn toàn khác. Vì vậy, tôi đoán rằng bài kiểm tra mà OP đã thực hiện để xác minh rằng thư mục tồn tại không được thực hiện ở điều kiện bình đẳng: trong trường hợp đầu tiên, anh ta sử dụng tài khoản của chính mình trong khi tài khoản thứ hai được sử dụng (chúng tôi chỉ có thể đoán cái nào ở giai đoạn này vì OP cung cấp chính xác 0 ngữ cảnh về ứng dụng của anh ấy). –

+0

Câu hỏi đã thay đổi do một số khám phá tôi đã thực hiện, vui lòng xem các chỉnh sửa của tôi. – nepa

2

Tôi cũng sử dụng ổ đĩa từ xa và phải mất vài giây để kết nối, vì vậy tôi chỉ cần đợi và hoạt động mọi lúc. Nếu nó không kết nối, nó sẽ gửi một email và tôi sẽ kiểm tra nó.

 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

Vâng, một người nào đó gắn cờ câu trả lời của tôi với -1. Tôi không hiểu TẠI SAO vì tôi cũng có tình huống tương tự như câu hỏi và mã này giải quyết nó. Mã này hoạt động và chỉ sử dụng mã .net, không phải thư viện bên ngoài làm câu trả lời được đánh dấu là giải pháp. –

+0

Đừng lo, tôi đã bình chọn nó. Nó thực sự là một giải pháp tốt, chính xác những gì tôi đang cố gắng làm. Nhưng tôi cũng không muốn cửa sổ cmd xuất hiện. Tuy nhiên, tôi chưa thử nghiệm mã của bạn, nhưng có vẻ đầy hứa hẹn. Cảm ơn bạn. – xmen

1

Tôi không chắc phiên bản của mpr.dll là giải pháp liên kết ở trên hoạt động, nhưng tôi đang sử dụng Win7 và có phiên bản hơi khác (mặc dù tương tự). điểm Mục nhập này là:

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

thì:

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

Bạn sẽ có thêm kiểm tra lỗi của bạn/xử lý riêng.

Các vấn đề liên quan