2009-12-20 39 views
29

cách mở hộp thoại Thuộc tính của tệp bằng một nútLàm cách nào để hiển thị hộp thoại Thuộc tính của tệp từ C#?

private void button_Click(object sender, EventArgs e) 
{ 
    string path = @"C:\Users\test\Documents\tes.text"; 
    // how to open this propertie 
} 

Cảm ơn bạn.

Ví dụ, nếu muốn các thuộc tính hệ thống

Process.Start("sysdm.cpl");  

Nhưng làm thế nào để tôi nhận được hộp thoại Properties dùng một đường dẫn tập tin?

+0

Câu hỏi của bạn không rõ ràng. Bạn có thể xây dựng? Bạn có ý gì khi "mở thuộc tính của tệp"? –

+1

Bạn có nghĩa là bạn muốn hiển thị trang thuộc tính Windows Explorer cho tệp đó, đúng không? –

+0

hello agian, là tôi muốn mở tệp Thuộc tính như cửa sổ nhấp chuột phải vào tệp và bạn có thể mở các thuộc tính của tệp –

Trả lời

41

Giải pháp là:

using System.Runtime.InteropServices; 

[DllImport("shell32.dll", CharSet = CharSet.Auto)] 
static extern bool ShellExecuteEx(ref SHELLEXECUTEINFO lpExecInfo); 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
public struct SHELLEXECUTEINFO 
{ 
    public int cbSize; 
    public uint fMask; 
    public IntPtr hwnd; 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public string lpVerb; 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public string lpFile; 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public string lpParameters; 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public string lpDirectory; 
    public int nShow; 
    public IntPtr hInstApp; 
    public IntPtr lpIDList; 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public string lpClass; 
    public IntPtr hkeyClass; 
    public uint dwHotKey; 
    public IntPtr hIcon; 
    public IntPtr hProcess; 
} 

private const int SW_SHOW = 5; 
private const uint SEE_MASK_INVOKEIDLIST = 12; 
public static bool ShowFileProperties(string Filename) 
{ 
    SHELLEXECUTEINFO info = new SHELLEXECUTEINFO(); 
    info.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(info); 
    info.lpVerb = "properties"; 
    info.lpFile = Filename; 
    info.nShow = SW_SHOW; 
    info.fMask = SEE_MASK_INVOKEIDLIST; 
    return ShellExecuteEx(ref info);   
} 

// button click 
private void button1_Click(object sender, EventArgs e) 
{ 
    string path = @"C:\Users\test\Documents\test.text"; 
    ShowFileProperties(path); 
} 
+0

Khi tôi chạy mã này bằng cách bước qua nó thông qua VS 2010 nó hoạt động, nhưng nó sẽ không hoạt động bất cứ khi nào tôi chạy nó thông qua một xây dựng thực thi. Nó thực sự kỳ lạ .. Nó thậm chí sẽ không chạy trong VS nếu tôi nhấn F5 (mà không cần tự bước qua mã) .. Bất cứ đề nghị? – wasatchwizard

+0

Có cách nào để sửa đổi điều này mà Cửa sổ Thuộc tính hiện lên không lấy nét không? Tôi muốn đặt điều này trong một ứng dụng dòng lệnh nhưng không bị mất tiêu điểm của cửa sổ dòng lệnh. Ngoài ra nó sẽ là thú vị để có chức năng chờ đợi cho cửa sổ để đóng trước khi trở về .. – MemphiZ

+1

Tôi đang làm một cái gì đó tương tự với một ứng dụng dòng lệnh, và trong khi nó chạy tốt trong một giao diện với một nút bấm, thông qua một lệnh- dòng nó chỉ autocloses ứng dụng ngay sau khi nó gọi nó.Có cách nào để lấy mã để chờ cửa sổ thuộc tính đóng trước khi đóng cửa sổ dòng lệnh gọi nó không? Tôi đã thử thay đổi '.fMask' thành' SEE_MASK_INVOKEIDLIST + SEE_MASK_NOCLOSEPROCESS' (và thêm vào đó là giá trị nguyên, 64), nhưng không có gì thay đổi. –

7

thuộc tính tập tin khác nhau có sẵn từ lớp FileInfo:

FileInfo info = new FileInfo(path); 
Console.WriteLine(info.CreationTime); 
Console.WriteLine(info.Attributes); 
... 
11

Gọi Process.Start, đi qua một ProcessStartInfo chứa tên của tập tin, và với sự ProcessStartInfo.Verb thiết lập để properties. (Mọi chi tiết, xem mô tả về các SHELLEXECUTEINFO cấu trúc không được quản lý, đó là những gì ProcessStartInfo kết thúc tốt đẹp, và đặc biệt là thành viên lpVerb.)

+1

hoạt động nhưng do đó hacky –

+8

Bạn có thể mở rộng lý do bạn cho rằng đó là hacky? ProcessStartInfo/ShellExecuteEx là cách tiêu chuẩn để gọi các hành động shell như "open", "print" và "show properties". Có sử dụng một cách trực tiếp hơn, SHObjectProperties, nhưng điều này đã được gỡ bỏ bắt đầu trong Vista, vì vậy ShellExecuteEx vẫn là phương pháp được tài liệu theo như tôi biết ... mở để sửa chữa! – itowlson

+6

Tôi đã thử điều này: var startInfo = new ProcessStartInfo (FileFullPath); startInfo.UseShellExecute = true; startInfo.Verb = "thuộc tính"; Process.Start (startInfo); dường như không hoạt động; Tôi nhận được một Win32Exception "Không có ứng dụng được liên kết với các tập tin được chỉ định cho hoạt động này" –

0

Giải pháp là sử dụng ShellExecute() api.

Làm thế nào để gọi api này bằng C#: http://weblogs.asp.net/rchartier/442339

này hoạt động tốt đối với tôi mà không CharSet thuộc tính cả trong Debug và chế độ phát hành.

Các vấn đề liên quan