Как определить, был ли путь к каталогу SUBST'd - PullRequest
6 голосов
/ 10 июня 2010

Как я могу определить, находится ли файл в папке, которая была SUBST'ed или находится в папке пользователя с помощью C #?

Ответы [ 4 ]

3 голосов
/ 10 июня 2010

Я думаю, вам нужно P / Invoke QueryDosDevice () для буквы диска. Subst Drive вернет символическую ссылку, похожую на \ ?? \ C: \ blah. Префикс \ ?? \ указывает, что он заменен, а остальное - диск + каталог.

2 голосов
/ 10 июня 2010

Я думаю, у вас есть несколько вариантов -

Через классы System.Management: http://briancaos.wordpress.com/2009/03/05/get-local-path-from-unc-path/

Или

Через P / Вызов этой функции MAPI: ScUNCFromLocalPath http://msdn.microsoft.com/en-us/library/cc842520.aspx

2 голосов
/ 10 июня 2010

Если SUBST запущен без параметров, он создает список всех текущих замен.Получите список и проверьте свой каталог по списку.

Существует также проблема сопоставления тома с каталогом.Я никогда не пытался их обнаружить, но каталоги точек монтирования отображаются иначе, чем обычные каталоги, поэтому у них должен быть какой-то другой атрибут, который можно обнаружить.

0 голосов
/ 17 мая 2016

Это код, который я использую для получения информации, если путь подсчитан: (Некоторые детали поставляются с pinvoke )

[DllImport("kernel32.dll", SetLastError=true)]
static extern uint QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath, int ucchMax);

public static bool IsSubstedPath(string path, out string realPath)
{
    StringBuilder pathInformation = new StringBuilder(250);
    string driveLetter = null;
    uint winApiResult = 0;

    realPath = null;

    try
    {
        // Get the drive letter of the path
        driveLetter = Path.GetPathRoot(path).Replace("\\", "");
    }
    catch (ArgumentException)
    {
        return false;
        //<------------------
    }

    winApiResult = QueryDosDevice(driveLetter, pathInformation, 250);

    if(winApiResult == 0)
    {
        int lastWinError = Marshal.GetLastWin32Error(); // here is the reason why it fails - not used at the moment!

        return false;
        //<-----------------
    }

    // If drive is substed, the result will be in the format of "\??\C:\RealPath\".
    if (pathInformation.ToString().StartsWith("\\??\\"))
    {
        // Strip the \??\ prefix.
        string realRoot = pathInformation.ToString().Remove(0, 4);

        // add backshlash if not present
        realRoot += pathInformation.ToString().EndsWith(@"\") ? "" : @"\";

        //Combine the paths.
        realPath = Path.Combine(realRoot, path.Replace(Path.GetPathRoot(path), ""));

        return true;
        //<--------------
    }

    realPath = path;

    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...