User6996
User6996

Reputation: 3013

How do I display a file's Properties dialog from C#?

How to open an file's Properties dialog by a button

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

Like windows right click on a file and you can open the Properties of the file.

For example if want the System properties

Process.Start("sysdm.cpl");    

But how do I get the Properties dialog for a file path?

Upvotes: 37

Views: 15188

Answers (5)

User6996
User6996

Reputation: 3013

Solution is:

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 = 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);
}

Upvotes: 58

Chris Tophski
Chris Tophski

Reputation: 960

To simplify handling Shell32 stuff and such, you could also use Vanara like:

using Vanara.PInvoke;
using System.Runtime.InteropServices;
// ...
void ShowProperties(string filepath)
{
    var info = new Shell32.SHELLEXECUTEINFO();

    info.cbSize = Marshal.SizeOf(info);
    info.lpVerb = "properties";
    info.lpFile = filepath;
    info.nShellExecuteShow = ShowWindowCommand.SW_SHOW;
    info.fMask = Shell32.ShellExecuteMaskFlags.SEE_MASK_INVOKEDLIST;

    Shell32.ShellExecuteEx(ref i);
}

and call it like:

ShowProperties(@"C:\The\Path\To\The\File.txt");

Upvotes: 0

AnjumSKhan
AnjumSKhan

Reputation: 9827

Solution is to use ShellExecute () api.

How to invoke this api using C# : http://weblogs.asp.net/rchartier/442339

This works fine for me without CharSet attribute both in Debug and Release mode.

Upvotes: 0

itowlson
itowlson

Reputation: 74842

Call Process.Start, passing a ProcessStartInfo containing the name of the file, and with the ProcessStartInfo.Verb set to properties. (For more info, see the description of the unmanaged SHELLEXECUTEINFO structure, which is what ProcessStartInfo wraps, and in particular the lpVerb member.)

Upvotes: 12

Michael Petrotta
Michael Petrotta

Reputation: 60972

Various file properties are available from the FileInfo class:

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

Upvotes: 7

Related Questions