列出网络位置的所有共享文件夹

本文关键字:共享 共享文件 文件夹 网络 位置 | 更新日期: 2023-09-27 18:20:17

我想列出网络服务器中的所有共享目录。

为了列出共享网络目录中的目录,我使用了

Directory.GetDirectories(@"''server'share'")

问题是我想列出''server上的所有文件夹。

如果我使用相同的方法,我会得到一个异常,说

UNC路径的格式应为''server''share

我到处找,找不到解决这个问题的办法。

有人知道我应该怎么做才能在''share中显示文件夹吗?

列出网络位置的所有共享文件夹

我知道这个线程很旧,但这个解决方案最终可能会帮助到一些人。我使用了一个命令行,然后从它的输出中返回一个子字符串,其中包含目录名。

    static void Main(string[] args)
    {
        string servername = "my_test_server";
        List<string> dirlist = getDirectories(servername);
        foreach (var dir in dirlist)
        {
            Console.WriteLine(dir.ToString());
        }      
        Console.ReadLine();
    }
    public static List<string> getDirectories (string servername)
    {
        Process cmd = new Process();
        cmd.StartInfo.FileName = "cmd.exe";
        cmd.StartInfo.RedirectStandardInput = true;
        cmd.StartInfo.RedirectStandardOutput = true;
        cmd.StartInfo.CreateNoWindow = true;
        cmd.StartInfo.UseShellExecute = false;
        cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        cmd.Start();
        cmd.StandardInput.WriteLine("net view ''''" + servername);
        cmd.StandardInput.Flush();
        cmd.StandardInput.Close();
        string output = cmd.StandardOutput.ReadToEnd();
        cmd.WaitForExit();
        cmd.Close();
        List<string> dirlist = new List<string>();
        if(output.Contains("Disk"))
        {
            int firstindex = output.LastIndexOf("-") + 1;
            int lastindex = output.LastIndexOf("Disk");
            string substring = ((output.Substring(firstindex, lastindex - firstindex)).Replace("Disk", string.Empty).Trim());
            dirlist = substring.Split(''n').ToList();
        }
        return dirlist;
    }

我能找到的最好的解决方案是从隐藏的cmd.exe实例调用"net"应用程序:

public static string[] GetDirectoriesInNetworkLocation(string networkLocationRootPath)
{
    Process cmd = new Process();
    cmd.StartInfo.FileName = "cmd.exe";
    cmd.StartInfo.RedirectStandardInput = true;
    cmd.StartInfo.RedirectStandardOutput = true;
    cmd.StartInfo.CreateNoWindow = true;
    cmd.StartInfo.UseShellExecute = false;
    cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    cmd.Start();
    cmd.StandardInput.WriteLine($"net view {networkLocationRootPath}");
    cmd.StandardInput.Flush();
    cmd.StandardInput.Close();
    string output = cmd.StandardOutput.ReadToEnd();
    cmd.WaitForExit();
    cmd.Close();
    output = output.Substring(output.LastIndexOf('-') + 2);
    output = output.Substring(0, output.IndexOf("The command completed successfully."));
    return
        output
            .Split(new[] { ''r', ''n' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(x => System.IO.Path.Combine(networkLocationRootPath, x.Substring(0, x.IndexOf(' '))))
            .ToArray();
}

根据您的使用情况,您可能需要验证networkLocationRootPath以避免任何cmd注入问题。

我无法编辑或评论Sellorio的答案,所以我做出了一个新的答案:

public static string[] GetDirectoriesInNetworkLocation(string networkLocationRootPath)
{
    Process cmd = new Process();
    cmd.StartInfo.FileName = "cmd.exe";
    cmd.StartInfo.RedirectStandardInput = true;
    cmd.StartInfo.RedirectStandardOutput = true;
    cmd.StartInfo.CreateNoWindow = true;
    cmd.StartInfo.UseShellExecute = false;
    cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    cmd.Start();
    cmd.StandardInput.WriteLine($"net view {networkLocationRootPath}");
    cmd.StandardInput.Flush();
    cmd.StandardInput.Close();
    string output = cmd.StandardOutput.ReadToEnd();
    cmd.WaitForExit();
    cmd.Close();
    output = output.Substring(output.LastIndexOf('-') + 2);
    output = output.Substring(0, output.IndexOf("The command completed successfully."));
    return
        output
            .Split(new[] { ''r', ''n' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(x => System.IO.Path.Combine(networkLocationRootPath, x.Substring(0, x.IndexOf(' '))))
            .ToArray();
}

如果您的执行路径中有一个"-",您将在第行收到一个零长度错误:

output = output.Substring(output.LastIndexOf('-') + 2);

通过首先删除路径修复此问题:

string CurrentExecutePath = System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
output = output.Replace(CurrentExecutePath, "");
output = output.Substring(output.LastIndexOf('-') + 2);

根据codeproject.com的说法,这似乎是.net缺少的一部分。尽管如此,该网站描述了一个在2003年起作用的解决方案。

你能试一下并解释一下它是否有效吗?