Re: net use
От: Blazkowicz Россия  
Дата: 02.07.07 07:53
Оценка: +1
Здравствуйте, alexmix, Вы писали:

A>День добрый. Подскажите плз, как мона замапить сетевой диск на java? Или ткните носом. Спасибо.

Runtime.exec()?
net use
От: alexmix  
Дата: 02.07.07 07:49
Оценка:
День добрый. Подскажите плз, как мона замапить сетевой диск на java? Или ткните носом. Спасибо.
Re[2]: net use
От: aefimov Россия
Дата: 02.07.07 08:07
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Runtime.exec()?


Добавлю немножко:

   public static boolean establishShareConnection(String sharedPath, String userName, String userPassword) throws IOException {
      // Establish connection
      return ProcessUtil.executeCommand(
         MessageFormat.format(
            "NET USE {0} /DELETE /Y & NET USE {0} {1} /USER:{2} /PERSISTENT:NO",
            new Object[]{sharedPath, userPassword, userName}
         )
      ).getExitCode() == 0;
   }


ProcessUtil — это враппер на Runtime.exec(MesageFormat.format("cmd.exe /C {0}", command));
Re[2]: net use
От: alexmix  
Дата: 02.07.07 09:08
Оценка:
спасибо. и еще вопросик: как проверить замапен диск или нет?
Re[3]: net use
От: aefimov Россия
Дата: 02.07.07 09:19
Оценка:
Здравствуйте, alexmix, Вы писали:

A>спасибо. и еще вопросик: как проверить замапен диск или нет?

Я вам не просто так код же привел
Смысл в том, что вы делаете один раз вызов NET USE \\server\share /DELETE /Y и потом сразу же NET USE \\server\share
Это приводит к тому, что у вас удаляется старая шара .если была и подмепливается новая. После этого вы можете работат ьс шарами напряму. Т.е. вполне валидно писать чтото вида:
new File("\\\\server\\share\\file.txt");

И оно будет работать.

Можно и не вызывать NET USE если вы уверены что шара будет доступна всегда и для всех. Но как только вам понадобиться указать имя пользователя — вам предется сначала «установить соединение» таким вот вызовом.
Re[4]: net use
От: alexmix  
Дата: 02.07.07 09:27
Оценка:
За код огромное спасибо, с ним все понятно.
Но мне необходимо сперва проверить существует ли замапенный диск, если нет, только потом мапить.
Re[5]: net use
От: aefimov Россия
Дата: 02.07.07 09:41
Оценка:
Здравствуйте, alexmix, Вы писали:

A>Но мне необходимо сперва проверить существует ли замапенный диск, если нет, только потом мапить.

Это можно, да. Коммандой "net use" без параметров и распарсить output. Только тут есть один ньюанс.
Допустим вы найшли что шара уже замеплена на диск X. Дальше вы начинаете использовать его.
Это будет работать если там доступ к шаре даден всем навсегда. А если пользователю сменили пароль и т.д. Вообщем как быть, если шара заэкспарилась и больше не работает? Она есть, существует. Но не работает.

Я поэтому не придумал ничего лучше как прибить все шары и создать новую, с заведомо правильным паролем и логином.
Re[6]: net use
От: alexmix  
Дата: 02.07.07 19:33
Оценка:
Здравствуйте, aefimov, Вы писали:

A>Это можно, да. Коммандой "net use" без параметров и распарсить output.


Плз, горю. а можно код ?я еще совсем новичок.
Re[7]: net use
От: aefimov Россия
Дата: 03.07.07 05:58
Оценка:
Здравствуйте, alexmix, Вы писали:

A>Плз, горю. а можно код ?я еще совсем новичок.


Как то так. Набросал на коленке, тесты отработали, но реально я этот код не использовал, так что погоняйте еще.
   public static File getShareDirectory(String share) throws IOException {
      if (share == null) {
         throw new IllegalArgumentException("share is null");
      }
      share = share.toLowerCase();
      Process process = ProcessUtil.exec("NET USE");
      try {
         InputStream inputStream = process.getInputStream();
         try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            for (String line = reader.readLine(); line != null; line = reader.readLine()) {
               String s = line.toLowerCase();
               if (s.startsWith("ok")) {
                  int index = s.indexOf(share);
                  if (index != -1) {
                     // This is correct share
                     // Cut device name (between 'OK' and share)
                     String deviceName = line.substring(2, index).trim();
                     if (deviceName.length() == 0) {
                        // Empty device, return share name
                        deviceName = line.substring(index, index + share.length());
                     }
                     File file = new File(deviceName);
                     if (file.exists() && file.isDirectory()) {
                        return file;
                     }
                  }
               }
            }
         } finally {
            inputStream.close();
         }
      } finally {
         process.destroy();
      }
      throw new FileNotFoundException(share);
   }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.