2013-02-01 55 views
6

Tôi có tên đường dẫn đầy đủ của một thư mục nhất định, ví dụ:Thao tác với đường dẫn thư mục trong Delphi?

c:\foo\bar 

Bây giờ tôi muốn tham khảo một tập tin bên trong c: \ foo tên baz.txt,

c:\foo\bar\..\baz.txt 

Tôi hiện đang sử dụng .. điều hành con đường để đi xuống một bậc và nhận được tập tin mà tôi cần.

Có chức năng nào có thể thực hiện thao tác trên đường dẫn hay không, ví dụ: UpOneLevel (str) -> str? Tôi biết tôi có thể viết một bằng cách tách chuỗi và xóa mã thông báo cuối cùng, nhưng tôi thích nó là một hàm tích hợp/thư viện để tôi không gặp rắc rối sau này nếu có, ví dụ: thoát dấu gạch chéo ngược.

+0

Phiên bản nào của Delphi? Phiên bản gần đây có đơn vị 'IOUtils', có thể có chức năng bạn đang tìm kiếm; nó sẽ là vô nghĩa để đăng một cái gì đó từ đó cho một câu trả lời nếu bạn đang sử dụng một phiên bản trước đó của Delphi. Bạn có lẽ nên thêm một thẻ phiên bản cụ thể (ví dụ: 'delphi-2007',' delphi-xe3', hoặc bất kỳ điều gì áp dụng) cho các thẻ khác mà bạn đã sử dụng. –

+0

@KenWhite Nó dành cho delphi-2007, tôi có may mắn không? – wmercer

+2

Tất nhiên là không. :-) Câu trả lời có thể khác, nhưng mọi thứ vẫn có thể. –

Trả lời

11

Sử dụng ExpandFileName chức năng:

var 
    S: string; 
begin 
    S := 'c:\foo\bar\..'; 
    S := ExpandFileName(S); 
    ShowMessage(S); 
end; 

Thông điệp từ ví dụ trên sẽ hiển thị đường dẫn c:\foo.

+3

+1. Làm tốt lắm - tôi nhận được một cú điện thoại, và bạn đã giải quyết nó trước khi tôi có thể quay lại. :-) –

2

Câu trả lời này có giá trị trong Delphi XE +

Sử dụng lớp TDirectory của đơn vị IOutils, trong đó có phương pháp GetParent, như thế này ::

uses IOUtils; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    s: string; 
begin 
    s := 'c:\foo\bar'; 
    ShowMessage(TDirectory.GetParent(s)); 
end; 

Trong phiên bản cũ

Nhìn vào các câu trả lời khác.

+0

Không tìm thấy IOUtils, tôi đang sử dụng Delphi-2007. – wmercer

+0

Câu hỏi được gắn thẻ rõ ràng là 'delphi-2007', không bao gồm' IOUtils'. (Tôi đã đề cập điều này trong bình luận của tôi cho câu hỏi ban đầu.) Không downvoting, nhưng chỉ đề cập đến. :-) –

+2

Đây là câu trả lời hay nhất cho các phiên bản hiện đại của Delphi, vì vậy, đừng xóa nó (và bỏ phiếu!) Nguy cơ với câu hỏi cũ như thế này là mọi người sử dụng câu trả lời đúng khi họ nên sử dụng thứ gì khác. –

4

Nhìn vào ExtractFilePath()ExtractFileDir(). Chúng có sẵn chỉ trong tất cả các phiên bản Delphi, đặc biệt là những phiên bản không có TDirectory, IOUtils, v.v.

Và trước khi bất cứ ai nói, các công việc này vẫn ổn cho dù đường dẫn có kết thúc bằng tên tệp hay không. ForceDirectories() sử dụng chúng trong nội bộ để đi bộ ngược thông qua một hệ thống phân cấp của thư mục mẹ, ví dụ.

1

Bạn có thể xem TPathBuilder bản ghi trong SvClasses đơn vị từ thư viện delphi-oop. Đơn vị này không hỗ trợ Delphi 2007 nhưng việc triển khai TPathBuilder tương thích với phiên bản Delphi này. Ví dụ về cách sử dụng:

var 
    LFullPath: string; 
begin 
    LFullPath := TPathBuilder.InitCustomPath('c:\foo\bar').GoUpFolder.AddFile('baz.txt').ToString; 
    //LFullPath = c:\foo\baz.txt 
Các vấn đề liên quan