Lấy (phần cuối của) tên thư mục hiện tại trong C #


158

Tôi cần lấy phần cuối của thư mục hiện tại, ví dụ từ /Users/smcho/filegen_from_directory/AIRPassthrough, tôi cần lấy AIRPassthrough.

Với python, tôi có thể lấy nó với mã này.

import os.path

path = "/Users/smcho/filegen_from_directory/AIRPassthrough"
print os.path.split(path)[-1]

Hoặc là

print os.path.basename(path)

Làm thế nào tôi có thể làm điều tương tự với C #?

THÊM

Với sự giúp đỡ từ những người trả lời, tôi đã tìm thấy những gì tôi cần.

using System.Linq;
string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName  = fullPath.Split(Path.DirectorySeparatorChar).Last();

hoặc là

string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName = Path.GetFileName(fullPath);


1
Trong python, bạn nên làm os.path.basename(path).
ReneSac

Câu trả lời:


132

Bạn đang tìm kiếm Path.GetFileName.
Lưu ý rằng điều này sẽ không hoạt động nếu đường dẫn kết thúc bằng a \.


3
@anti: Sai; Tôi đã thử nó. Chuỗi là chuỗi. Dán Path.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")vào LINQPad nếu bạn không tin tôi.
SLaks

@antisanity Không, nó sẽ trả về tên thư mục, nhưng có lẽ nó không chính xác là câu hỏi gì.
Jakob Möllås

@Jakob: Đưa ra tiêu đề, tôi nghĩ đây là câu hỏi.
SLaks

3
@Light: Nó không làm việc; thử nó. Các Pathlớp xử lý cả hai dải phân cách.
SLaks

31
Để có công việc này với một thư mục được Directory.GetDirectories lấy ra, hãy sử dụng: string libraryName = Path.GetFileName (thư mục.TrimEnd (Path.DirectorySeparatorChar));
Fatlad

184

Bạn có thể thử:

var path = @"/Users/smcho/filegen_from_directory/AIRPassthrough/";
var dirName = new DirectoryInfo(path).Name;

20
Tôi thích điều này tốt hơn câu trả lời được chọn. (Ab) sử dụng GetFileName là sai về mặt ngữ nghĩa vì đó là thư mục bạn đang cố truy xuất. Ngoài ra, để làm cho GetFileName xác định có nghĩa là bạn phải tính đến khả năng dấu gạch chéo hoặc dấu gạch chéo ngược và cắt nó đi, điều này thật xấu xí.
Simon Brangwin

var dirName = new DirectoryInfo (Path.GetDirectoryName (pathWithFilename)). Tên // là tốt hơn
kernowcode

@kernowcode Tôi tin rằng sẽ trả lại "filegen_from_directory" thay vì '' AIRPassthrough "theo yêu cầu của OP.
codybartfast

1
@SimonBrangwin Tôi nghĩ mọi thứ đều là một tệp trong Linux :)
Dao cạo

12

Vâng, để trả lời chính xác tiêu đề câu hỏi của bạn :-)

var lastPartOfCurrentDirectoryName = 
   Path.GetFileName(Environment.CurrentDirectory);

12

Đây là một câu trả lời hơi khác nhau, tùy thuộc vào những gì bạn có. Nếu bạn có một danh sách các tập tin và cần lấy tên của thư mục cuối cùng mà tập tin nằm trong đó, bạn có thể làm điều này:

string path = "/attachments/1828_clientid/2938_parentid/somefiles.docx";
string result = new DirectoryInfo(path).Parent.Name;

Điều này sẽ trả về "2938_parentid"


8

thay vì sử dụng '/' cho lệnh gọi để phân tách, tốt hơn là sử dụng Path.DirectorySeparatorChar:

như vậy

path.split(Path.DirectorySeparatorChar).Last() 

1
Một điều tôi không thích khi sử dụng giải pháp này là nó đưa ra một giả định về việc chuỗi đến từ đâu. Điều gì xảy ra nếu họ đang đọc nhật ký * nix trên Hệ thống Windows? Sau đó, ký tự sai sẽ được sử dụng và bạn sẽ kết thúc với toàn bộ đường dẫn, thay vì hiệu ứng dự định. Chỉ cần 2 xu của tôi.
Bob G

Tôi đồng ý với bạn về điều này. OP đã nói 'phần cuối của thư mục hiện tại' vì vậy, điều này là tốt.
Muad'Dib

6
var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));

Điều này hoạt động nếu đường dẫn xảy ra để chứa dấu phân cách dấu gạch chéo hoặc dấu phân cách dấu gạch chéo ngược.


1
Dường như chuỗi.TrimEnd () chấp nhận nhiều ký tự, do đó không cần sử dụng nhiều cuộc gọi. msdn.microsoft.com/en-us/l Library / Mạnh
Kyle Delaney

1
@KyleDelaney vậy đó! Trả lời điều chỉnh.
Holf

1
Đó là một mảng params, vì vậy .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)cũng hoạt động.
Kyle Delaney

1
Vị trí áp dụng của .TrimEnd () không chính xác. Nó nên được áp dụng cho đường dẫn , không phải Path.GetFileName . Xem câu trả lời từ @Fatlad
Tony

2

Thử cái này:

String newString = "";
Sting oldString = "/Users/smcho/filegen_from_directory/AIRPassthrough";

int indexOfLastSlash = oldString.LastIndexOf('/', 0, oldString.length());

newString = oldString.subString(indexOfLastSlash, oldString.length());

Mã có thể bị tắt (tôi chưa kiểm tra nó) nhưng ý tưởng sẽ hoạt động


1

Điều này hoạt động hoàn toàn tốt với tôi :)

Path.GetFileName(path.TrimEnd('\\')


0

Bạn cũng có thể sử dụng lớp Uri.

new Uri("file:///Users/smcho/filegen_from_directory/AIRPassthrough").Segments.Last()

Bạn có thể thích sử dụng lớp này nếu bạn muốn có một số phân khúc khác hoặc nếu bạn muốn làm điều tương tự với một địa chỉ web.

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.