Как определить фактический путь подключенного диска? - PullRequest
44 голосов
/ 14 января 2010

Как определить фактический путь подключенного диска?

Итак, если у меня есть подключенный диск на машине с именем «Z», как я могу с помощью .NET определить машину и путь для сопоставленной папки?

Код может предполагать, что он работает на машине с подключенным диском.

Я посмотрел на объекты Path, Directory, FileInfo, но не могу ничего найти.

Я также искал существующие вопросы, но не смог найти то, что искал.

Ответы [ 13 ]

2 голосов
/ 14 января 2010

Кажется, что требуется P / Invoke: Преобразование буквы подключенного диска в сетевой путь с помощью C #

Этот парень создал управляемый класс для работы с ним: C # Map Network Drive (API)

0 голосов
/ 19 апреля 2018

Этот пост описывает, как получить абсолютный путь к диску, который сопоставлен с локальной папкой?

Например, у меня есть папка "c: \ test" и диск "x:", который сопоставлено с c: \ test.

Я ищу функцию, которая будет возвращать "c: \ test" при прохождении "Х:"

Ответ:

SUBST использует DefineDosDevice (XP и более поздние версии) для создания диска / пути отображение. Вы можете использовать QueryDosDevice, чтобы получить путь SUBSTed диск:

[DllImport("kernel32.dll")]

private    static extern uint QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath, int ucchMax);

static String GetPhysicalPath(String path)

{

    if (String.IsNullOrEmpty(path))

    {

        throw new ArgumentNullException("path");

    }

    // Get the drive letter

    string pathRoot = Path.GetPathRoot(path);

    if(String.IsNullOrEmpty(pathRoot))

    {

        throw new ArgumentNullException("path");

    }

    string lpDeviceName = pathRoot.Replace("\\", "");



    const String substPrefix = @"\??\";

    StringBuilder lpTargetPath = new StringBuilder(260);



    if (0 != QueryDosDevice(lpDeviceName, lpTargetPath, lpTargetPath.Capacity))

    {

        string result;



        // If drive is substed, the result will be in the format of "\??\C:\RealPath\".

        if (lpTargetPath..ToString().StartsWith(substPrefix))

        {

            // Strip the \??\ prefix.

            string root = lpTargetPath.ToString().Remove(0, substPrefix.Length);



            result = Path.Combine(root, path.Replace(Path.GetPathRoot(path), ""));

        }

        else

        {

            // TODO: deal with other types of mappings.

            // if not SUBSTed, just assume it's not mapped.

            result = path;

        }

        return result;

    }

    else

    {

        // TODO: error reporting

        return null;

    }

}
0 голосов
/ 14 января 2010

Что касается Windows, то необходим вызов WNetGetConnection. Я не знаю внешнего интерфейса для этого в .NET, поэтому вам, возможно, придется вызывать его через P / Invoke (к счастью, он имеет только один параметр, код P / Invoke не так уж ужасен).

...