Nhận đường dẫn đầy đủ mà không có tên tệp từ đường dẫn bao gồm tên tệp


198

Có bất cứ điều gì được xây dựng vào System.IO.Path đó mang lại cho tôi chỉ là filepath?

Ví dụ, nếu tôi có một string

@ "c: \ webserver \ public \ myCompany \ configs \ promo.xml",

Có phương pháp BCL nào sẽ cho tôi không

"c: \ webserver \ public \ myCompany \ configs \"?



FWIW: Tôi đã "từ bỏ" việc xử lý "đường dẫn" của Đường dẫn và chúng tôi sử dụng các phương pháp của riêng mình với kỳ vọng và tính đồng nhất tốt hơn với UNC (thử sử dụng GetDirectoryName trên đường dẫn UNC) và các quy ước (ví dụ: trailing /).
dùng2864740

Trừ khi tập tin hoặc thư mục tồn tại, không có cách nào để biết liệu promo.xmlchỉ định một tập tin hoặc một thư mục có cùng tên đó. Đó có lẽ là lý do tại sao Path.GetDirectoryName()được thực hiện đơn giản như vậy và chỉ cắt bớt đoạn cuối cùng hoặc xóa dấu gạch chéo nếu có.
Abel

Câu trả lời:


241

Path.GetDirectoryName()... nhưng bạn cần biết rằng đường dẫn bạn đang đi tới nó có chứa tên tệp; nó chỉ đơn giản là loại bỏ bit cuối cùng khỏi đường dẫn, cho dù đó là tên tệp hoặc tên thư mục (nó thực sự không có ý tưởng nào).

Trước tiên, bạn có thể xác thực bằng cách kiểm tra File.Exists()và / hoặc Directory.Exists()trên đường dẫn của mình để xem bạn có cần gọi khôngPath.GetDirectoryName


2
Không cần gọi File.Exists(). Thật vậy, nó khá phản tác dụng trong trường hợp lý do bạn tìm tên thư mục là để tạo nó nếu nó không tồn tại.
Jon Hanna

3
Ví dụ của ông ghi chú rõ ràng một đường dẫn với một tên tệp. Nếu đó là mô hình của các đường dẫn anh ta đang kiểm tra và nếu các đường dẫn đó đại diện cho các tệp hiện có, kiểm tra File.Exists () chắc chắn sẽ hữu ích, bạn có đồng ý không? Tất nhiên, vì tình huống có thể là khác, tôi chỉ đề nghị anh ta 'có thể' sử dụng các phương thức Exists trên Tệp và / hoặc Thư mục; rõ ràng, như thích hợp cho tình hình của mình.
Andrew Barber

Có, một đường dẫn với một tên tập tin. Không có gì trong đó để chỉ ra một tệp tồn tại, vì tên tệp xuất hiện trước.
Jon Hanna

4
Như tôi đã nói; đó là một lựa chọn và nó có thể giúp tùy thuộc vào những gì đã biết về đường dẫn. Hoặc nó có thể không cần thiết ở tất cả. Nhưng kiểm tra File.Exists () và Directory.Exists () trên cùng một đường dẫn là một cách nhanh chóng và dễ dàng để biết liệu một đường dẫn, tồn tại, là một tệp hoặc thư mục.
Andrew Barber

5
như một tài liệu tham khảo nhanh, dự phòng với câu hỏi và điều trị "rõ ràng", bạn cần đưa System.IOvào để làm việc này.
cregox

70
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 

2
Đây là thứ tốt nhất. Hãy nhớ using System.IO;sử dụng các phương thức đường dẫn
Lỗi cú pháp

Lưu ý rằng điều này không bao gồm dấu gạch chéo (tầm thường để thêm một dấu)
Mingwei Samuel

51

Path.GetDirectoryName()trả về tên thư mục, vì vậy với những gì bạn muốn (với ký tự solidus ngược) bạn có thể gọi Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar.


12
    string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml";

    string currentDirectory = Path.GetDirectoryName(fileAndPath);

    string fullPathOnly = Path.GetFullPath(currentDirectory);

currentDirectory: c: \ webserver \ public \ myCompany \ configs

fullPathOnly: c: \ webserver \ public \ myCompany \ configs


6
Vui lòng cung cấp một số thông tin về cách mã ở trên trả lời câu hỏi để cải thiện câu trả lời này.
Eric Hauenstein

1
Path.GetFullPath trả về fullpath mà không cần tên tệp.
Kobie Williams

hiển thị đầu ra sẽ hữu ích, tôi không biết sự khác biệt giữa hai dòng cuối cùng là gì.
gakera

đầu ra sẽ là -> c: \ webserver \ public \ myCompany \ configs
Kobie Williams

5

Sử dụng 'GetParent ()' như được hiển thị, hoạt động độc đáo. Thêm kiểm tra lỗi khi bạn cần.

var fn = openFileDialogSapTable.FileName;
var currentPath = Path.GetFullPath( fn );
currentPath = Directory.GetParent(currentPath).FullName;

4

Tôi đã sử dụng nó và nó hoạt động tốt:

string[] filePaths = Directory.GetFiles(Path.GetDirectoryName(dialog.FileName));

foreach (string file in filePaths)
{   
    if (comboBox1.SelectedItem.ToString() == "")
    {
        if (file.Contains("c"))
        {
            comboBox2.Items.Add(Path.GetFileName(file));
        }
    }
}
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.