Nhận tên thư mục từ đường dẫn tệp đầy đủ


116

Làm cách nào để lấy tên thư mục từ đường dẫn đầy đủ của ứng dụng?

Đây là đường dẫn tệp bên dưới,

c:\projects\root\wsdlproj\devlop\beta2\text

Ở đây "văn bản" là tên thư mục.

Làm thế nào tôi có thể có được tên thư mục từ đường dẫn này?

Câu trả lời:


205

Xem DirectoryInfo.Name :

string dirName = new DirectoryInfo(@"c:\projects\roott\wsdlproj\devlop\beta2\text").Name;

Điều này không yêu cầu thư mục thực sự tồn tại trong hệ thống tệp (tên thư mục vẫn sẽ là "văn bản" cho đường dẫn tệp đầy đủ đó nếu thư mục "c: \ dự án \ root \ wsdlproj \ devlop \ beta2 \ text" không ( hiện tại) tồn tại trong hệ thống tập tin)?
Peter Mortensen

@PeterMortensen, không. Tôi vừa thử nghiệm điều này và phương thức trả về tên của thư mục cấp thấp nhất từ ​​chuỗi, ngay cả khi đường dẫn thư mục không tồn tại.
vbguyny

1
Cảm ơn, câu trả lời tuyệt vời. Nhưng tôi hơi bối rối rằng System.IO.Directory không hỗ trợ thao tác như vậy.
anhoppe

1
@anhoppe - Tôi đồng ý. Một tùy chọn khác mà tôi thấy là Path.GetDirectoryName msdn.microsoft.com/en-us/l Library / Lỗi - nhưng sẽ không thể kiểm tra nó cho đến ngày mai.
Don Cheadle

30

Tôi nghĩ rằng bạn muốn lấy tên thư mục cha từ đường dẫn tệp. Nó rất dễ dàng để có được. Một cách là tạo một FileInfođối tượng kiểu và sử dụng thuộc tính của nó Directory.

Thí dụ:

FileInfo fInfo = new FileInfo("c:\projects\roott\wsdlproj\devlop\beta2\text\abc.txt");

String dirName = fInfo.Directory.Name;

16

Thử cái này

var myFolderName = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
var result = Path.GetFileName(myFolderName);

nếu bạn có một tên tệp thành chuỗi, nó cũng trả về tên tệp
swissben

1
Trong trường hợp này, văn bản là tên tệp (không có phần mở rộng). Tôi nghĩ đó là những gì OP đã có sau. Nếu đó là một thư mục hoặc tên tệp không thực sự quan trọng. Nếu chuỗi không chứa tên tệp, mã này sẽ cung cấp cho anh ta những gì anh ta theo sau.
Øyvind Bråthen

4
Trừ khi các đường dẫn kết thúc bằng một \ như thế này:@"c:\projects\roott\wsdlproj\devlop\beta2\text\"
Kristof Claes

1
Điều này không làm việc cho một thư mục. Tôi nhận được một chuỗi trống. Phải có một tập tin hiện tại
BraveNewMath

3
Điều này chỉ hoạt động tốt nếu đường dẫn thư mục không chứa dấu gạch chéo ngược (ví dụ như đường dẫn thư mục được trả về từ Path.GetDirectoryName () ). Tuy nhiên, tên của hàm đó, GetFileName (), hơi sai lệch.
Peter Mortensen

9

Bạn có thể sử dụng điều này:

string path = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
string lastDirectory = path.Split(new char[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries).Last();

Điều gì xảy ra nếu đường dẫn trông như thế này: @ "c: \ dự án \ roott \ wsdlproj \ devlop \ beta2 \ text \", vì vậy, với một Thư mục bổ
sungSayatorChar

1
@Alex - Tôi đã sửa đổi mã của mình để làm cho nó hoạt động với các loại đường dẫn đó. StringSplitOptions.RemoveEmptyEntrieskhông lừa
Kristof Claes

Theo msdn.microsoft.com/en-us/l Library / Mối , FileInfo có thể đưa ra một ngoại lệ nếu không có sự cho phép cần thiết.
Daniel B

5

Đơn giản chỉ cần sử dụng Path.GetFileName

Tại đây - Trích xuất tên thư mục từ đường dẫn đầy đủ của thư mục:

string folderName = Path.GetFileName(@"c:\projects\root\wsdlproj\devlop\beta2\text");//Return "text"

Đây là một số bổ sung - Trích xuất tên thư mục từ đường dẫn đầy đủ của một tệp:

string folderName = Path.GetFileName(Path.GetDirectoryName(@"c:\projects\root\wsdlproj\devlop\beta2\text\GTA.exe"));//Return "text"

3

Tôi đoán rằng không có cách nào khác ngoài việc đi vào hệ thống tệp để tìm hiểu xem text.txt là một thư mục hay chỉ là một tệp. Nếu bạn muốn một cái gì đó đơn giản, có lẽ bạn chỉ cần sử dụng:

s.Substring(s.LastIndexOf(@"\"));

1
Để tránh dấu gạch chéo ở phía trước chuỗi: s.Sub chuỗi (s.LastIndexOf (@ "\") + 1);
David Yates

2

Trong trường hợp này, tệp mà bạn muốn nhận được lưu trữ trong biến strpath:

string strPath = Server.MapPath(Request.ApplicationPath) + "/contents/member/" + strFileName;

2

Đây là một phương pháp thay thế phù hợp với tôi mà không phải tạo đối tượng DirectoryInfo. Điểm mấu chốt là GetFileName()hoạt động khi không có dấu gạch chéo trong đường dẫn.

var name = Path.GetFileName(path.TrimEnd(Path.DirectorySeparatorChar));

Thí dụ:

var list = Directory.EnumerateDirectories(path, "*")
        .Select(p => new
        {
            id = "id_" + p.GetHashCode().ToString("x"),
            text = Path.GetFileName(p.TrimEnd(Path.DirectorySeparatorChar)),
            icon = "fa fa-folder",
            children = true
        })
        .Distinct()
        .OrderBy(p => p.text);

1

Điều này cũng có thể được thực hiện như vậy;

var directoryName = System.IO.Path.GetFileName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");

điều này sẽ trả về một chuỗi rỗng
đĩalosr

@disklosr - vừa được thử nghiệm với ScriptC và nó trả về 'văn bản'
Steve Cooper

2
Điều này chỉ hoạt động tốt nếu đường dẫn thư mục không chứa dấu gạch chéo ngược (ví dụ như đường dẫn thư mục được trả về từ Path.GetDirectoryName () ). Tuy nhiên, tên của hàm đó, GetFileName (), hơi sai lệch.
Peter Mortensen

0

Dựa trên các câu trả lời trước (nhưng đã sửa)

using static System.IO.Path;

var dir = GetFileName(path?.TrimEnd(DirectorySeparatorChar, AltDirectorySeparatorChar));

Giải thích GetFileNametừ nguồn .NET :

Trả về tên và phần mở rộng của đường dẫn đã cho. Chuỗi kết quả chứa các ký tự của đường dẫn theo dấu gạch chéo ngược cuối cùng ("\"), dấu gạch chéo ("/") hoặc ký tự dấu hai chấm (":") trong đường dẫn. Chuỗi kết quả là toàn bộ đường dẫn nếu đường dẫn không chứa dấu gạch chéo ngược sau khi xóa dấu gạch chéo, dấu gạch chéo hoặc ký tự dấu hai chấm. Chuỗi kết quả là null nếu đường dẫn là null.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.