2014-09-01 14 views
5

Tôi muốn liệt kê tất cả các thư mục được chia sẻ từ một máy chủ mạng.Liệt kê tất cả các thư mục được chia sẻ từ một vị trí mạng

Để liệt kê danh bạ từ một thư mục chia sẻ trên mạng tôi đã sử dụng

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

Vấn đề là tôi muốn liệt kê tất cả các thư mục trên \\server.

Nếu tôi sử dụng phương pháp tương tự tôi nhận được một ngoại lệ nói

Đường dẫn UNC nên có dạng \ server \ share

Tôi nhìn khắp nơi và tôi không thể tìm một giải pháp cho việc này.

Có ai có ý tưởng về việc tôi nên làm gì để hiển thị các thư mục trong \\share không?

+0

bản sao có thể có của [Nhận danh sách tất cả các thư mục được chia sẻ UNC trên máy chủ mạng cục bộ] (http://stackoverflow.com/questions/3567063/get-a-list-of-all-unc-shared-folders- on-a-local-network-server) – kamaradclimber

Trả lời

1

Giải pháp tốt nhất tôi có thể tìm được gọi là "thuần" ứng dụng từ một trường hợp cmd.exe ẩn:

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(); 
} 

Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể muốn xác nhận networkLocationRootPath để tránh bất kỳ vấn đề tiêm cmd.

0

Điều này có vẻ là một phần thiếu của .net theo codeproject.com. Trang web vẫn mô tả một số solution hoạt động vào năm 2003.

Bạn có thể thử và giải thích nếu nó hoạt động không?

+0

Đây không phải là những gì OP muốn. Điều này là để liệt kê các thư mục được chia sẻ từ máy của bạn. OP (và I) muốn liệt kê các thư mục được chia sẻ từ một máy khác trên mạng. –

+1

Tôi thực sự rất vui khi nhận được nhận xét về câu trả lời từ ~ 3 năm trước :) – kamaradclimber

+0

Tôi đã tìm kiếm điều này và đây là một trong những câu hỏi xuất hiện. Bây giờ tôi đã thêm giải pháp mà tôi tìm thấy làm câu trả lời. –

2

Tôi biết chủ đề này cũ, nhưng giải pháp này cuối cùng có thể giúp ai đó. Tôi đã sử dụng một dòng lệnh sau đó trả về một chuỗi con từ đầu ra của nó chứa các tên thư mục.

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; 
    } 
Các vấn đề liên quan