Используя C #, как узнать, находится ли папка в сети или нет - PullRequest
6 голосов
/ 10 августа 2011

Используя C #, я хотел бы, чтобы мое приложение возвращало, находится ли папка (с уже известным путем) в сети или на моем компьютере.

Как я могу это сделать?

Ответы [ 6 ]

6 голосов
/ 10 августа 2011

Если вы говорите о подключенном сетевом диске, вы можете использовать DriveInfo 's DriveType свойство :

var driveInfo = new DriveInfo("S:\");
if(driveInfo.DriveType == DriveType.Network)
    // do something
4 голосов
/ 10 августа 2011

Оригинальный ответ из другого вопроса SO, Проверьте, находится ли путь в сети .

Использование PathIsNetworkPath (pinvoke reference ):

class Program
{
    [DllImport("shlwapi.dll")]
    private static extern bool PathIsNetworkPath(string pszPath);

    static void Main(string[] args)
    {
        Console.WriteLine(PathIsNetworkPath("i:\Backup"));
    }
}
3 голосов
/ 10 августа 2011

Исходя из ответов @jgauffin и @Daniel, вы можете попробовать этот небольшой взлом:

private static bool IsNetwork(String path)
{
    if (path.StartsWith(@"\\"))
       return true;
    var dir = new DirectoryInfo(path);
    var drive = new DriveInfo(dir.Root.ToString());
    return drive.DriveType == DriveType.Network;
}
0 голосов
/ 10 августа 2011

Вы можете использовать следующий метод, чтобы получить UNC-путь к папке. Не совсем то, что вы ищете, но может быть полезно

    public static string GetUniversalPath(string folderPath)
    {
        if (String.IsNullOrEmpty(folderPath) || folderPath.IndexOf(":") > 1)
            return folderPath;

        if (folderPath.StartsWith("\\"))
        {
            return folderPath;
        }
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT RemoteName FROM win32_NetworkConnection WHERE LocalName = '" + folderPath.Substring(0, 2) + "'");
        foreach (ManagementObject managementObject in searcher.Get())
        {
            string remoteName = managementObject["RemoteName"] as String;
            if (!String.IsNullOrEmpty(remoteName))
            {
                remoteName += folderPath.Substring(2);
                return remoteName;
            }            
        }
        return folderPath;
    }
0 голосов
/ 10 августа 2011

Попробуйте следующее из Shell Lightweight Utility API :

class Class
{
    [DllImport("shlwapi.dll")]
    private static extern bool PathIsNetworkPath(string Path);

    [STAThread]
    static void Main(string[] args)
    {
        string strPath = "D:\\Temp\\tmpfile.txt";
        bool blnIsLocalPath = IsLocalPath(strPath);
        Console.WriteLine(blnIsLocalPath.ToString());
        Console.ReadLine();
    }

    private static bool IsLocalPath(string Path)
    {
        return !PathIsNetworkPath(Path);
    }
 }

Что нужно учитывать:

  • Пути, начинающиеся с двух символов обратной косой черты (\) интерпретируются как пути UNC.
  • Пути, начинающиеся с буквы, за которой следует двоеточие (:), интерпретируются как подключенный сетевой диск.Однако PathIsNetworkPath не может распознать сетевой диск, сопоставленный с буквой диска с помощью команды Microsoft MS-DOS SUBST или функции DefineDosDevice
0 голосов
/ 10 августа 2011
var dirInfo = new DirectoryInfo(yourPath);
var driveInfo = new DriveInfo(dirInfo.Root);
if (driveInfo.DriveType == DriveType.Network)
    Console.WriteLine("Is a network drive!");
...