Câu hỏi Làm cách nào để mở Explorer bằng một tệp cụ thể được chọn?


Tôi muốn mã hóa một hàm mà bạn có thể vượt qua đường dẫn tệp, ví dụ:

C:\FOLDER\SUBFOLDER\FILE.TXT

và nó sẽ mở Windows Explorer với thư mục chứa tệp và sau đó chọn tệp này bên trong thư mục. (Tương tự như khái niệm "Hiển thị trong thư mục" được sử dụng trong nhiều chương trình.)

Tôi có thể làm cái này như thế nào?


33
2017-12-03 09:33


gốc


Ngoài ra, có thể chọn nhiều tệp không? - Colonel Panic
Không có vẻ như vậy - Jester
Có thể trùng lặp Triển khai "Mở thư mục chứa" và đánh dấu tệp - RandomEngy


Các câu trả lời:


Cách dễ nhất mà không cần sử dụng các hàm shell Win32 là chỉ cần khởi chạy explorer.exe với /select tham số. Ví dụ: khởi chạy quy trình

explorer.exe /select,"C:\Folder\subfolder\file.txt" 

sẽ mở một cửa sổ thám hiểm mới vào thư mục con C: \ Folder \ với file.txt được chọn.

Nếu bạn muốn làm điều đó theo chương trình mà không cần khởi chạy một quy trình mới, bạn sẽ cần phải sử dụng hàm shell SHOpenFolderAndSelectItems, đó là những gì /select lệnh để explorer.exe sẽ sử dụng nội bộ. Lưu ý rằng điều này đòi hỏi việc sử dụng các PIDL, và có thể là một PITA thực nếu bạn không quen thuộc với cách các API vỏ hoạt động.

Dưới đây là triển khai hoàn chỉnh, có lập trình của /select cách tiếp cận, với dọn dẹp đường dẫn nhờ các gợi ý từ @Bhushan và @tehDorf:

public bool ExploreFile(string filePath) {
    if (!System.IO.File.Exists(filePath)) {
        return false;
    }
    //Clean up file path so it can be navigated OK
    filePath = System.IO.Path.GetFullPath(filePath);
    System.Diagnostics.Process.Start("explorer.exe", string.Format("/select,\"{0}\"", filePath));
    return true;
}

Tài liệu tham khảo: Thiết bị chuyển mạch dòng lệnh Explorer.exe


82
2017-12-03 09:35



Bạn cần một dấu phẩy sau khi chọn như thế này explorer.exe / select, "c: \ folder \ subfolder \ file.txt - Justin Harvey
@Justin Cảm ơn, đã sửa. - Mahmoud Al-Qudsi
Nhược điểm của việc tung ra một quy trình mới là gì? - Gusdor
@ Gusdor Không có gì, thực sự. Trừ khi bạn đã kích hoạt các cửa sổ thư mục được khởi chạy trong một quá trình riêng biệt trong các tùy chọn xem thư mục của bạn (theo mặc định, nó bị tắt) điều này không thực sự khởi chạy một tiến trình mới. Nó đi qua các chuyển động, nhưng một cá thể explorer.exe hiện có sẽ được gọi để xử lý yêu cầu thay vì tung ra một tiến trình mới trong một không gian bộ nhớ riêng biệt. Nếu bạn đang gọi mã này rất nhiều, nó chắc chắn hiệu quả hơn và ít lãng phí hơn để sử dụng SHOpenFolderAndSelectItems trong suốt quá trình mở đầu. - Mahmoud Al-Qudsi
@ MahmoudAl-Qudsi Thay vì sử dụng Regex để dọn dẹp đường dẫn tệp, bạn có thể sử dụng filePath = System.IO.Path.GetFullPath(filePath);. Nó sẽ bình thường hóa các phân cách thư mục và nó cũng sẽ giải quyết các đường dẫn tương đối, chẳng hạn như nếu bạn truyền vào một cái gì đó như @"..\some\relative\file\path.txt" hoặc là @"C:\Some\relative\..\file\path.txt". Bạn cũng có thể cập nhật ví dụ để sử dụng nội suy chuỗi mới: Process.Start("explorer.exe", $"/select,\"{filePath}\""); - tehDorf


Khi thực hiện lệnh nếu đường dẫn của bạn chứa nhiều dấu gạch chéo thì nó sẽ không mở thư mục và chọn tệp đúng cách Hãy đảm bảo rằng đường dẫn tệp của bạn phải như thế này

C: \ a \ b \ x.txt

thay vì

C: \\ a \\ b \\ x.txt


2
2017-12-04 06:42