Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Как узнать UNC-Path в C#?

146  
  aifl прохожий13.02.07 16:13
NEW 13.02.07 16:13 
Привет,
на сервере стоит программа и коллеги имеющие доступ пользуются ей центрально. Если пользователь скопировал е╦ локально, то программа это должна различать. Пока мне ни чего другого на ум не пришло, как проверить в какой директории используемая программа находится.
Для этого я ищу функцию в C#, которая мне выдаст UNC-Директорию, т.к. логические ссылки не однозначны (к примеру: Environment.CurrentDirectory).
Может кто знает как решить?
#1 
Rius постоялец13.02.07 17:12
13.02.07 17:12 
в ответ aifl 13.02.07 16:13
string path = Directory.GetCurrentDirectory();
#2 
Rius постоялец13.02.07 18:34
NEW 13.02.07 18:34 
в ответ aifl 13.02.07 16:13
Я не внимательно прочел в первый раз.
В продолжение к предыдущему,
попробуй вот это:
ManagementObject driveInfo = new ManagementObject( path );
string uncPath = string.Format( "{0}", driveInfo[ "ProviderName" ].ToString());
#3 
  aifl прохожий14.02.07 10:33
NEW 14.02.07 10:33 
в ответ Rius 13.02.07 18:34, Последний раз изменено 14.02.07 10:59 (aifl)
Пишит: "RPC-Server nicht verfügbar" (The RPC Server is Unavailable)...
возможно WNetGetUniversalName решит проблему, буду пробовать...
#4 
Rius постоялец14.02.07 13:53
NEW 14.02.07 13:53 
в ответ aifl 14.02.07 10:33
интерсную задачку подкинул. Спасибо :) Когда-то я делал такое с API- функциями и там было все просто. Вызов GetDriveType() и сразу получаешь информацию какого типа он.
А тут пришлось повозится, запрятали ее будь здоров.
Короче, если я правильно понял и тебе нужно узнать откуда застартовали программу с локального или сетевого лауфверка, то у меня получилось так:
using System.Management;
using System.IO;
string path = Directory.GetDirectoryRoot(Directory.GetCurrentDirectory());
ManagementObject driveInfo = new ManagementObject();
ManagementPath mpath = new ManagementPath(string.Format("Win32_LogicalDisk='{0}'", path.Substring(0,2)));
driveInfo.Path = mpath;
PropertyDataCollection diskProperties = driveInfo.Properties;
string type = diskProperties["DriveType"].Value.ToString();
теперь так если type = "3", то это локальный диск, если "4" - то сетевой.
Подробнее здесь
http://www.dotnet247.com/247reference/msgs/9/47182.aspx
#5 
  aifl прохожий14.02.07 15:53
NEW 14.02.07 15:53 
в ответ Rius 14.02.07 13:53, Последний раз изменено 14.02.07 16:04 (aifl)
:)
Спасибо, теперь могу распознать тип диска! Что я в итоге хотел:
1. создать const string-переменную: szServerPath = "\\MyServer\\Programs\\MyExe".
2. узнать адрес, с которого программа запущена: string szCurAppPath = Environment.CurrentDirectory;
3. сверить их: if( szCurAppPath.Equals(szServerPath) == true )....
Т.е теперь ещё бы узнать, если сетевой, то какое у него UNC-название...
#6 
  aifl гость14.02.07 16:23
NEW 14.02.07 16:23 
в ответ aifl 14.02.07 15:53
Наш╦л: string szName = driveInfo.Properties["ProviderName"].Value.ToString();
Спасибо!
#7 
Rius постоялец14.02.07 16:43
NEW 14.02.07 16:43 
в ответ aifl 14.02.07 15:53
я бы не засовывал "\\MyServer\\Programs\\MyExe" в константную переменную.
Решение будет не скалируемым. Имя сервера или path могут поменяться.
Тебе не достаточно распознать с какого диска локального или сетвого запущена программа?
У этого обьекта diskProperties из предыдущего примера, есть кроме "DriveType" куча других проперти. Например можно проверять или это сетевой диск не по "DriveType", а по "Description". Для сетевого "Description" будет равна "Network".
Кроме того есть проперти "ProviderName". Вроде бы она должна возвращать UNC-Path. Вот тут об этом http://www.dotnet247.com/247reference/msgs/52/261775.aspx
Я не могу протестировать, т.к. у меня нет прав запустить мой анвендунг с сетевого диска.
#8 
Rius постоялец14.02.07 16:46
NEW 14.02.07 16:46 
в ответ aifl 14.02.07 16:23
Ну вот и отлично. :)
#9 
  aifl гость14.02.07 16:57
NEW 14.02.07 16:57 
в ответ Rius 14.02.07 16:46
Я с тобой согласен, решение не элегантно. Если меняется сервер, то константную переменную нужно менять руками.
Программа расчитана на работников нашей фирмы и я являюсь е╦ администратором, т.е она не на продажу.
К сожалению мне не достаточно распознать с какого диска запущена программа т.к. в \\MyServer\\Programs\\MyExe\\Test часто выставляю бета-версию, и она не должна "полноценно" работать.
#10 
  aifl гость14.02.07 17:06
NEW 14.02.07 17:06 
в ответ Rius 14.02.07 16:43, Последний раз изменено 15.02.07 11:11 (aifl)
И при Description на английском виндовсе: "Network", а на немецком: "Netzwerkverbindung"... не, 3 или 4 мне больше нравятся :), всё равно спасибо за совет!
#11 
Rius постоялец14.02.07 17:25
NEW 14.02.07 17:25 
в ответ aifl 14.02.07 17:06
Да действительно с "Description" можно попасть. Это я как-то не подумал.
Будем знать. :)
#12 
AlterEgo Чеширръ15.02.07 08:37
AlterEgo
NEW 15.02.07 08:37 
в ответ Rius 14.02.07 17:25
Кстати, узнать откуда программа запущена лучше так.
System.Reflection.Assembly.GetEntryAssembly().Location
CurrentDirectory в общем случае может показывать куда попало
*Ъ...
#13 
  aifl гость15.02.07 11:10
NEW 15.02.07 11:10 
в ответ AlterEgo 15.02.07 08:37
Спасибо!
#14