1 (edited by mikhail_a 2017-07-07 13:37:43)

Topic: Как получить пути сетевых дисков пользователя (Решено)

Пользователи работают в сетевой версии написанной программы. В базу сохраняют ссылки на файлы, лежащие в локальной сети на сервере. У каждого из пользователей этот сервер подключен как сетевой диск, но буквы сетевого диска у пользователей не совпадают. Т.е. у одного пользователя имеется диск "S" с путем \\10.0.0.1\Sales, а у другого пользователя этот же путь подключен под буквой "Q". Когда один пользователь сохранил в БД ссылку "S:\Filedir1", то другой пользователь открыть эту папку не может, т.к. такого сетевого диска у него нет. Вопрос: как получить абсолютный путь сетевого диска? Если это невозможно скриптом, то может быть можно получить данные из ветки реестра HKEY_CURRENT_USER\Network, где указаны все сетевые диски пользователя и пути к ним?

Re: Как получить пути сетевых дисков пользователя (Решено)

К сожалению не сталкивался с таким, лучше конечно использовать ip или имя компьютера в сети, чтобы не допустить такого.
Если все же ресурс доступен в сети по имени или ip, думаю можно скриптом подставлять ip ресурса вместо буквы диска при выборе файла.

Dmitry.

Re: Как получить пути сетевых дисков пользователя (Решено)

Решил задачу получения пути сетевого диска из реестра с помощью класса TRegistry.
Публикую решение - может кому-нибудь окажется полезным пример работы с реестром:

procedure Form1_Btn_Read_Reg_OnClick (Sender: string; var Cancel: boolean);
  var
      Reg: TRegistry;
      RegKeyName: string;
      DiskName: string;
      RemotePath: string;
begin
  DiskName:= 'Q'; // буква имеющегося сетевого диска
  RegKeyName:= '\Network\' + DiskName; \\ ветка реестра, где лежит путь этого сетевого диска
  Reg := TRegistry.Create();
  Reg.Access:= Key_read;
  Reg.RootKey := HKEY_CURRENT_USER;
  Reg.OpenKey(RegKeyName, false);

  if (Reg.KeyExists(RegKeyName)) then
  begin
      ShowMessage ('Путь сетевого диска ' + DiskName + ' = ' + Reg.ReadString('RemotePath'));
  end
  else
  begin
      ShowMessage ('Сетевого диска с буквой ' + DiskName + ' не существует');
  end;
  Reg.CloseKey;
  Reg.free;
end;