Tôi đã tìm thấy một bài đăng trên blog với chức năng kỹ lưỡng, thậm chí phức tạp nhất mà tôi từng thấy để giải quyết vấn đề này. Nó xử lý mọi thứ, thậm chí là các trường hợp góc kinh khủng như V:foo.txt
nơi bạn sử dụng lệnh subst
để ánh xạ V:
đến Z:
nhưng bạn đã sử dụng subst
để ánh xạ Z:
tới một số ổ đĩa khác; nó lặp lại cho đến khi tất cả các lệnh subst
được bỏ qua. URL:
http://pdh11.blogspot.com/2009/05/pathcanonicalize-versus-what-it-says-on.html
Dự án của tôi là mã C tinh khiết, và chức năng đó là C++. Tôi bắt đầu dịch nó, nhưng sau đó tôi đã tìm ra rằng tôi có thể nhận được đường dẫn chuẩn hóa mà tôi muốn với một hàm gọi: GetLongPathName(). Điều này sẽ không xử lý các trường hợp góc khủng khiếp, nhưng nó xử lý các nhu cầu trước mắt của tôi.
tôi phát hiện ra rằng GetLongPathName("foo.txt")
chỉ trả foo.txt
, nhưng chỉ bằng cách thêm vào trước ./
vào tên tập tin tôi đã mở rộng mẫu bình thường:
GetLongPathName("./foo.txt")
, nếu thực hiện trong thư mục C:\Users\steveha
, trả C:\Users\steveha\foo.txt
.
Vì vậy, trong giả:
nếu char thứ hai của tên đường dẫn được ':' hoặc char đầu tiên là '/' hoặc '\', chỉ cần gọi GetLongPathName() khác, sao chép "./" vào một bộ đệm tạm thời, sau đó sao chép tên tệp thành bộ đệm tạm thời + 2, để lấy một bản sao của tên tệp được thêm vào với "./" và sau đó gọi GetLongPathName().
Miễn là hai đường dẫn giải quyết các tệp trên cùng một máy tính, thì có vẻ như GetFileInformationByHandle() là câu trả lời đúng.Nếu họ giải quyết cho các máy tính khác nhau, tôi không thấy bảo đảm, và tôi cũng không thấy một cách nhỏ nhặt để có được một máy tính. Nó không nhất thiết phải dễ dàng để thử nghiệm cho điều này. – RBerteig
Tất cả các tệp đều là cục bộ trong trường hợp của tôi, do đó, công trình này hoạt động. –
@RBerteig: Tôi không thấy một cách tầm thường để có được một. Nhưng tôi đã tìm thấy một điều rất không tầm thường và đặt nó vào một câu trả lời; hãy xem. Ngay cả cái đó hầu như chỉ đơn giản là dễ dàng, nhưng nó phải là quá đủ cho hầu hết mọi người. – steveha