9

Delphi には、ファイル名を受け取り、それを UNC に相当するものに変換する関数 ExpandUNCFileName があります。マップされたドライブを展開し、ローカルおよび既に展開されている場所をスキップします。

サンプル

C:\Folder\Text.txt -> C:\Folder\Text.txt
L:\Folder\Sample.txt -> \\server\Folder1\Folder\Sample.txt ここで、L: は \\server\Folder1 にマップされます\
\\server\Folder\Sample.odf -> \server\Folder\Sample.odf

C# でこれを行う簡単な方法はありますか、または Windows API 呼び出し WNetGetConnection を使用してから、マップされないものを手動でチェックする必要がありますか?

4

4 に答える 4

6

これは、ラッパー関数 LocalToUNC を使用した C# コードです。十分にテストしていませんが、問題なく動作しているようです。

    [DllImport("mpr.dll")]
    static extern int WNetGetUniversalNameA(
        string lpLocalPath, int dwInfoLevel, IntPtr lpBuffer, ref int lpBufferSize
    );

    // I think max length for UNC is actually 32,767
    static string LocalToUNC(string localPath, int maxLen = 2000)
    {
        IntPtr lpBuff;

        // Allocate the memory
        try
        {
            lpBuff = Marshal.AllocHGlobal(maxLen); 
        }
        catch (OutOfMemoryException)
        {
            return null;
        }

        try
        {
            int res = WNetGetUniversalNameA(localPath, 1, lpBuff, ref maxLen);

            if (res != 0)
                return null;

            // lpbuff is a structure, whose first element is a pointer to the UNC name (just going to be lpBuff + sizeof(int))
            return Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(lpBuff));
        }
        catch (Exception)
        {
            return null;
        }
        finally
        {
            Marshal.FreeHGlobal(lpBuff);
        }
    }
于 2013-10-01T16:06:09.440 に答える
5

P/呼び出しWNetGetUniversalName()ます。

www.pinvoke.net からこのコードを変更して実行しました。

于 2009-09-11T15:34:03.440 に答える
2

BCL には、同等の処理を行う組み込み関数はありません。あなたが提案したように、WNetGetConnectionにpInvokingするのが最善の選択肢だと思います。

于 2009-09-11T15:28:02.190 に答える
0

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;

さよなら。

于 2009-09-11T15:40:17.763 に答える