2011-10-27 50 views

Trả lời

8

trình với cả hai phía trước và trở lại giảm

static string GetRootFolder(string path) 
{ 
    while (true) 
    { 
     string temp = Path.GetDirectoryName(path); 
     if (String.IsNullOrEmpty(temp)) 
      break; 
     path = temp; 
    } 
    return path; 
} 
+0

Ooh, đó là điều không thể tránh khỏi. – bobbymcr

+2

Đừng nghĩ rằng sẽ trả về thư mục đầu tiên như được yêu cầu. Nhưng kể từ khi nó đã được đánh dấu là câu trả lời có vẻ như nó phục vụ mục đích ... trong trường hợp đó câu hỏi là không chính xác. Vui lòng cập nhật – aateeque

+0

Nó sẽ miễn là thư mục đầu tiên không bắt đầu với bất kỳ loại dấu gạch chéo nào, nếu không nó sẽ chỉ trả về dấu gạch chéo. Đối với trường hợp sử dụng của tôi trong url web, tôi chỉ cần cắt giảm dấu gạch chéo. –

6

Có vẻ như bạn chỉ có thể sử dụng phương pháp string.Split() trên chuỗi, sau đó lấy phần tử đầu tiên.
dụ (chưa được kiểm tra):

string str = "foo\bar\abc.txt"; 
string str2 = "bar/foo/foobar"; 


string[] items = str.split(new char[] {'/', '\'}, StringSplitOptions.RemoveEmptyEntries); 

Console.WriteLine(items[0]); // prints "foo" 

items = str2.split(new char[] {'/', '\'}, StringSplitOptions.RemoveEmptyEntries); 
Console.WriteLine(items[0]); // prints "bar" 
5

Các giải pháp mạnh mẽ nhất sẽ được sử dụng DirectoryInfoFileInfo. Trên một hệ thống dựa trên Windows NT, nó sẽ chấp nhận hoặc chuyển tiếp hoặc dấu gạch chéo ngược cho dấu phân cách.

using System; 
using System.IO; 

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     Console.WriteLine(GetTopRelativeFolderName(@"foo\bar\abc.txt")); // prints 'foo' 
     Console.WriteLine(GetTopRelativeFolderName("bar/foo/foobar")); // prints 'bar' 
     Console.WriteLine(GetTopRelativeFolderName("C:/full/rooted/path")); // ** throws 
    } 

    private static string GetTopRelativeFolderName(string relativePath) 
    { 
     if (Path.IsPathRooted(relativePath)) 
     { 
      throw new ArgumentException("Path is not relative.", "relativePath"); 
     } 

     FileInfo fileInfo = new FileInfo(relativePath); 
     DirectoryInfo workingDirectoryInfo = new DirectoryInfo("."); 
     string topRelativeFolderName = string.Empty; 
     DirectoryInfo current = fileInfo.Directory; 
     bool found = false; 
     while (!found) 
     { 
      if (current.FullName == workingDirectoryInfo.FullName) 
      { 
       found = true; 
      } 
      else 
      { 
       topRelativeFolderName = current.Name; 
       current = current.Parent; 
      } 
     } 

     return topRelativeFolderName; 
    } 
} 
0

Dưới đây là một ví dụ trong trường hợp đường dẫn của bạn nếu định dạng sau:

string path = "c:\foo\bar\abc.txt"; // or c:/foo/bar/abc.txt 
string root = Path.GetPathRoot(path); // root == c:\ 
+0

Có _any_ Hệ điều hành sử dụng quy ước 'c:/foo/bar/abc.txt'? –

+0

Bạn cần phải thoát khỏi các dấu gạch chéo ngược hoặc sử dụng các chuỗi nguyên văn ('@" ... "'). – bobbymcr

+0

Thoát là cần thiết, tôi đồng ý, chuỗi khác không hợp lệ. Bất kể quy ước nào, ví dụ nhắm mục tiêu câu hỏi của người dùng và nếu "c: /foo/bar/abc.txt" được cung cấp, mã vẫn hoạt động. – Dan

1

Dựa trên những câu hỏi mà bạn hỏi, sau đây nên công việc:

public string GetTopLevelDir(string filePath) 
    { 
     string temp = Path.GetDirectoryName(filePath); 
     if(temp.Contains("\\")) 
     { 
      temp = temp.Substring(0, temp.IndexOf("\\")); 
     } 
     else if (temp.Contains("//")) 
     { 
      temp = temp.Substring(0, temp.IndexOf("\\")); 
     } 
     return temp; 
    } 

Khi qua foo\bar\abc.txt nó sẽ foo như wanted- tương tự cho các/trường hợp

1

Dựa trên câu trả lời cung cấp bởi Hasan Khan ...

private static string GetRootFolder(string path) 
{ 
    var root = Path.GetPathRoot(path); 
    while (true) 
    { 
     var temp = Path.GetDirectoryName(path); 
     if (temp != null && temp.Equals(root)) 
      break; 
     path = temp; 
    } 
    return path; 
} 

này sẽ cung cấp cho các thư mục cấp cao nhất

+0

Đây là câu trả lời của bạn. Sử dụng phương pháp này để chuyển: foo \ bar \ abc.txt -----> foo thanh/foo/foobar -----> thanh – Tyrant

Các vấn đề liên quan