2011-12-25 5 views
7

Мы пытаемся получить доступ к каталогу, который находится в пределах сетевого каталога, но получить неверный результат (C#/Windows):Как заставить Windows, чтобы подключиться к сетевому диску

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

«Z» является сетевым каталогом, " Сеансы "- это каталог, в котором программное обеспечение для записи постоянно создает каталоги (например,« Data1 ») и помещает в него некоторые данные. Кажется, что Windows кэширует неправильное состояние Data1: метод возвращает false. Но когда я обращаюсь к каталогу через Explorer, он здесь. Когда я запускаю метод (Directory.Exists) после доступа к каталогу с помощью Explorer, он возвращает true. Конечно, я могу гарантировать, что каталог действительно существует с первой попытки.

В чем причина такого поведения? Что я могу сделать с этим?

Редактировать: Похоже, что Windows не удалось подключить сетевой диск к удаленному компьютеру. Когда я пытаюсь перейти в каталог с помощью Explorer, он автоматически пытается подключить диск.

Итак, вопрос меняется: Есть ли способ заставить окна попробовать переподключиться через .NET?

Решение: Reconnecting a disconnected network drive

+0

Если вы получаете доступ к каталогу с помощью команды 'DIR' из командной строки, вы получаете правильную информацию? То есть: 'dir Z: \ Sessions \ Data1'. –

+0

Нет, доступ к каталогу с помощью командной строки не обновляет подключение к сетевому диску. Пожалуйста, см. Мое редактирование ... – nepa

ответ

0

В чем причина такого поведения?

Цитата из documentation:

Если вы не имеете как минимум разрешение только для чтения в каталог, Exists метод возвращает ложь.


Что я могу поделать?

Убедитесь, что вы используете приложение .NET под учетной записью, имеющей как минимум разрешение только для чтения для доступа к этой папке. Обратите внимание: если вы пишете это в приложении ASP.NET, это, вероятно, не будет так, поэтому в зависимости от того, на какой учетной записи вы настроили свой веб-сервер для выполнения своего приложения, выполните необходимые действия для предоставления разрешений для этой учетной записи.

+0

, как указано в OP: «Когда я запускаю метод (Directory.Exists) после доступа к каталогу с Explorer, он возвращает true.» - это означает, что, скорее всего, это проблема кеширования, а не разрешения –

+1

@ EugeneMayevski'EldoSCorp, когда вы используете проводник, вы запускаете его под своей учетной записью. Когда вы запускаете приложение ASP.NET, оно может работать под совершенно другой учетной записью. Поэтому я предполагаю, что тест, который OP выполнил для проверки того, что каталог существует, не выполнялся на равных условиях: в первом случае он использовал свою собственную учетную запись, тогда как во второй используется другая учетная запись (мы могли только гадать, какой из них на данном этапе, поскольку ОП предоставил ровно 0 контекста о его применении). –

+0

Вопрос изменился из-за некоторых открытий, которые я сделал, см. Мои правки. – nepa

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-код, а не внешнюю библиотеку как ответ, который был помечен как решение. –

+0

Не волнуйтесь, я встретил это голосование. Это действительно хорошее решение, именно то, что я пытаюсь сделать. Но я также не хочу, чтобы появилось окно cmd. Однако я не тестировал ваш код, но он выглядит многообещающим. Спасибо. – xmen

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

Вы должны добавить свои собственные проверки ошибок/обработки.

Смежные вопросы