Получите путь UNC от локального пути или отображенного пути

То, что я сделал в прошлом, должно иметь файл конфигурации по умолчанию, в котором регистрируются к управлению исходным кодом. Затем у каждого разработчика есть их собственный файл конфигурации переопределения, который исключен из управления исходным кодом. Приложение сначала загружает значение по умолчанию, и затем если файл переопределения присутствует, загрузки это и использует какие-либо настройки от переопределения в предпочтении к файлу по умолчанию.

В целом, чем меньший файл переопределения, тем лучше, но это может всегда содержать больше настроек для разработчика с очень нестандартной средой.

7
задан Chris J 11 September 2009 в 15:25
поделиться

3 ответа

В BCL нет встроенной функции, которая выполняла бы аналогичные функции. Я думаю, что лучший вариант, который у вас есть, - это pInvoking в WNetGetConnection, как вы предложили.

2
ответ дан 6 December 2019 в 21:17
поделиться

P / Invoke WNetGetUniversalName () .

Я сделал это, изменив этот код с www.pinvoke.net.

5
ответ дан 6 December 2019 в 21:17
поделиться

Попробуйте этот код, он написан на Delphi .Net

, вы должны перевести его на C #

function WNetGetUniversalName; external;
[SuppressUnmanagedCodeSecurity, DllImport(mpr, CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'WNetGetUniversalNameA')]


function ExpandUNCFileName(const FileName: string): string;

function GetUniversalName(const FileName: string): string;
const
UNIVERSAL_NAME_INFO_LEVEL = 1;    
var
  Buffer: IntPtr;
  BufSize: DWORD;
begin
  Result := FileName;
  BufSize := 1024;
  Buffer := Marshal.AllocHGlobal(BufSize);
  try
    if WNetGetUniversalName(FileName, UNIVERSAL_NAME_INFO_LEVEL,
      Buffer, BufSize) <> NO_ERROR then Exit;
    Result := TUniversalNameInfo(Marshal.PtrToStructure(Buffer,
      TypeOf(TUniversalNameInfo))).lpUniversalName;
  finally
    Marshal.FreeHGlobal(Buffer);
  end;
end;

begin
  Result :=System.IO.Path.GetFullPath(FileName);
  if (Length(Result) >= 3) and (Result[2] = ':') and (Upcase(Result[1]) >= 'A')
    and (Upcase(Result[1]) <= 'Z') then
    Result := GetUniversalName(Result);
end;

Пока.

0
ответ дан 6 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: