2008-12-02 30 views
113

Tôi đang cố mở một thư mục trong trình khám phá bằng một tệp được chọn.Mở một thư mục trong trình khám phá và chọn một tập tin

Các mã sau đây tạo ra một tập tin không tìm thấy ngoại lệ:

System.Diagnostics.Process.Start(
    "explorer.exe /select," 
    + listView1.SelectedItems[0].SubItems[1].Text + "\\" 
    + listView1.SelectedItems[0].Text); 

Làm thế nào tôi có thể nhận được lệnh này để thực hiện trong C#?

Trả lời

61

Sử dụng this method:

Process.Start(String, String) 

tranh luận đầu tiên là một ứng dụng (explorer.exe), lập luận Phương pháp thứ hai là đối số của ứng dụng bạn chạy.

Ví dụ:

trong CMD:

trong C#:

Process.Start("explorer.exe", "-p") 
+4

này không chọn tập tin như Samuel Yangs trả lời – henon

5

Bạn cần đặt đối số để chuyển ("/ select etc") vào tham số thứ hai của phương thức Bắt đầu.

11

Sử dụng "/select,c:\file.txt"

Chú ý nên có là dấu phẩy sau/select thay vì không gian ..

233
// suppose that we have a test.txt at E:\ 
string filePath = @"E:\test.txt"; 
if (!File.Exists(filePath)) 
{ 
    return; 
} 

// combine the arguments together 
// it doesn't matter if there is a space after ',' 
string argument = "/select, \"" + filePath +"\""; 

System.Diagnostics.Process.Start("explorer.exe", argument); 
+1

nó có ý nghĩa đối với tôi :) nó không chỉ mở thư mục nhưng chọn các tập tin cụ thể như Vâng :) cảm ơn liên quan –

+1

Nó hoạt động như một sự quyến rũ nhưng bất kỳ ý tưởng làm thế nào chúng ta có thể làm điều đó cho nhiều tập tin? – Pankaj

+5

Ghi chú nhỏ, đối số/chọn có đường dẫn tệp dường như không hoạt động đối với tôi nếu đường dẫn tệp của tôi sử dụng dấu gạch chéo chuyển tiếp. Vì vậy tôi phải làm filePath = filePath.Replace ('/', '\\'); –

30

Chỉ cần 2 xu giá trị, nếu tên tệp của bạn chứa khoảng trắng, nghĩa là "c: \ My File Contains Spaces.txt", bạn cần bao quanh tên tệp với dấu ngoặc kép, nếu không trình khám phá giả định rằng các từ khác nhau đối số ...

string argument = "/select, \"" + filePath +"\""; 
+3

Thực ra, không, bạn không. Ví dụ của @Samuel Yang hoạt động với các đường dẫn có dấu cách (thử nghiệm Win7) –

+8

Đọc câu trả lời của Phil Hustwick bên dưới về lý do bạn nên đặt dấu ngoặc kép xung quanh tuy nhiên – Akku

17

Samuel Yang trả lời cho tôi, đây là giá trị 3 xu của tôi.

Adrian Hum đúng, đảm bảo bạn đặt dấu ngoặc kép xung quanh tên tệp của mình. Không phải vì nó không thể xử lý không gian như zourtney chỉ ra, nhưng bởi vì nó sẽ nhận ra các dấu phẩy (và có thể các ký tự khác) trong tên tập tin như là các đối số riêng biệt. Vì vậy, nó sẽ giống như Adrian Hum đề nghị.

string argument = "/select, \"" + filePath +"\""; 
5
string windir = Environment.GetEnvironmentVariable("windir"); 
if (string.IsNullOrEmpty(windir.Trim())) { 
    windir = "C:\\Windows\\"; 
} 
if (!windir.EndsWith("\\")) { 
    windir += "\\"; 
}  

FileInfo fileToLocate = null; 
fileToLocate = new FileInfo("C:\\Temp\\myfile.txt"); 

ProcessStartInfo pi = new ProcessStartInfo(windir + "explorer.exe"); 
pi.Arguments = "/select, \"" + fileToLocate.FullName + "\""; 
pi.WindowStyle = ProcessWindowStyle.Normal; 
pi.WorkingDirectory = windir; 

//Start Process 
Process.Start(pi) 
24

Nếu đường dẫn của bạn chứa của dấu phẩy, đặt dấu ngoặc kép quanh đường dẫn sẽ làm việc khi sử dụng Process.Start (ProcessStartInfo).

Nó sẽ không hoạt động khi sử dụng Process.Start (chuỗi, chuỗi). Nó có vẻ như Process.Start (chuỗi, chuỗi) thực sự loại bỏ các dấu ngoặc kép bên trong của args của bạn.

Đây là một ví dụ đơn giản phù hợp với tôi.

string p = @"C:\tmp\this path contains spaces, and,commas\target.txt"; 
string args = string.Format("/e, /select, \"{0}\"", p); 

ProcessStartInfo info = new ProcessStartInfo(); 
info.FileName = "explorer"; 
info.Arguments = args; 
Process.Start(info); 
+0

Đây phải là câu trả lời được chấp nhận. Nó chỉ thiếu một xử lý ngoại lệ thích hợp cho các lỗi khác nhau có thể (vấn đề quyền, đường dẫn sai, vv) – AFract

+0

Đây là câu trả lời đúng, câu trả lời được chấp nhận không hoạt động, câu trả lời của Yang cũng không hoạt động. –

3

Sử dụng Process.Start trên explorer.exe với lập luận /select kỳ quặc chỉ hoạt động cho đường dẫn dưới dài 120 ký tự.

tôi đã phải sử dụng một phương pháp cửa sổ mẹ đẻ để có được nó để làm việc trong mọi trường hợp:.

[DllImport("shell32.dll", SetLastError = true)] 
public static extern int SHOpenFolderAndSelectItems(IntPtr pidlFolder, uint cidl, [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl, uint dwFlags); 

[DllImport("shell32.dll", SetLastError = true)] 
public static extern void SHParseDisplayName([MarshalAs(UnmanagedType.LPWStr)] string name, IntPtr bindingContext, [Out] out IntPtr pidl, uint sfgaoIn, [Out] out uint psfgaoOut); 

public static void OpenFolderAndSelectItem(string folderPath, string file) 
{ 
    IntPtr nativeFolder; 
    uint psfgaoOut; 
    SHParseDisplayName(folderPath, IntPtr.Zero, out nativeFolder, 0, out psfgaoOut); 

    if (nativeFolder == IntPtr.Zero) 
    { 
     // Log error, can't find folder 
     return; 
    } 

    IntPtr nativeFile; 
    SHParseDisplayName(Path.Combine(folderPath, file), IntPtr.Zero, out nativeFile, 0, out psfgaoOut); 

    IntPtr[] fileArray; 
    if (nativeFile == IntPtr.Zero) 
    { 
     // Open the folder without the file selected if we can't find the file 
     fileArray = new IntPtr[0]; 
    } 
    else 
    { 
     fileArray = new IntPtr[] { nativeFile }; 
    } 

    SHOpenFolderAndSelectItems(nativeFolder, (uint)fileArray.Length, fileArray, 0); 

    Marshal.FreeCoTaskMem(nativeFolder); 
    if (nativeFile != IntPtr.Zero) 
    { 
     Marshal.FreeCoTaskMem(nativeFile); 
    } 
} 
+0

Điều này đã giúp tôi sử dụng lại một thư mục. Process.Start ("explorer.exe", "/ select xxx") mở một thư mục mới mỗi lần! – Mitkins

+0

đây là cách nó nên được thực hiện, tôi cũng sẽ tạo ra một lá cờ cho sfgao, và vượt qua enum thay vì uint –

+0

Điều này làm việc mặc dù với một vấn đề nhỏ; lần đầu tiên thư mục mở nó không được tô sáng. Tôi gọi điều này bên trong một phương pháp bấm nút, và một khi thư mục được mở nếu tôi nhấp vào nút một lần nữa, sau đó nó làm nổi bật tập tin/thư mục đã chọn. Điều gì có thể là vấn đề? – Sach

2

Lý do nhất có thể cho nó không phải để tìm tập tin là con đường có khoảng trống trong Ví dụ, nó sẽ không tìm thấy "explorer/select, c: \ space space \ space.txt".

Chỉ cần thêm dấu ngoặc kép trước và sau đường dẫn, như;

explorer /select,"c:\space space\space.txt" 

hoặc làm điều tương tự trong C# với

System.Diagnostics.Process.Start("explorer.exe","/select,\"c:\space space\space.txt\""); 
Các vấn đề liên quan