2009-12-20 4 views
29

comment ouvrir la boîte de dialogue Propriétés d'un fichier par un boutonComment afficher la boîte de dialogue Propriétés d'un fichier à partir de C#?

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

Merci.

Par exemple si vous voulez les propriétés du système

Process.Start("sysdm.cpl");  

Mais comment puis-je obtenir la boîte de dialogue Propriétés pour un chemin de fichier?

+0

Votre question n'est pas claire. Peux-tu élaborer? Que voulez-vous dire par "ouvrir les propriétés d'un fichier"? –

+1

Vous voulez dire que vous voulez afficher la feuille de propriétés de l'Explorateur Windows pour ce fichier, n'est-ce pas? –

+0

bonjour agian, est que je veux ouvrir le fichier Propriété comme des fenêtres faites un clic droit sur un fichier et vous pouvez ouvrir les propriétés du fichier –

Répondre

41

Solution est:

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

Lorsque je lance ce code en le parcourant via VS 2010 cela fonctionne, mais cela ne fonctionnera pas quand je le lance via un exécutable de construction. C'est vraiment bizarre .. Il ne fonctionnera même pas dans VS si je tape F5 (sans passer manuellement le code). Des suggestions? – wasatchwizard

+0

Y a-t-il un moyen de modifier cela que la fenêtre Propriétés n'apparaît pas? Je voudrais mettre cela dans une application de ligne de commande, mais ne pas perdre le focus de la fenêtre de ligne de commande. Aussi, il serait intéressant d'avoir la fonction d'attendre la fermeture de la fenêtre avant de retourner. – MemphiZ

+1

Je fais quelque chose de similaire avec une application en ligne de commande, et pendant qu'il fonctionne bien dans une interface graphique avec un clic de bouton, via une commande- ligne, il autoclose l'application dès qu'elle l'appelle.Est-il possible d'attendre que la fenêtre de propriétés se ferme avant de fermer la fenêtre de ligne de commande qui l'a appelée? J'ai essayé de changer '.fMask' à' SEE_MASK_INVOKEIDLIST + SEE_MASK_NOCLOSEPROCESS' (et j'ai ajouté sa valeur entière, 64, aussi), mais rien n'a changé. –

7

Diverses propriétés de fichiers sont disponibles à partir de la classe FileInfo:

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

Appel Process.Start, le passage d'un ProcessStartInfo contenant le nom du fichier, et avec l'ensemble ProcessStartInfo.Verb à properties. (Pour plus d'informations, voir la description de la structure SHELLEXECUTEINFO non gérée, ce qui est enveloppe ProcessStartInfo, et en particulier le membre lpVerb.)

+1

fonctionne mais si hacky –

+8

Pourrait développer sur pourquoi vous pensez que c'est hacky? ProcessStartInfo/ShellExecuteEx est la manière standard d'appeler des actions de shell telles que "ouvrir", "imprimer" et "afficher les propriétés". Il y avait auparavant une méthode plus directe, SHObjectProperties, mais celle-ci a été supprimée à partir de Vista, donc ShellExecuteEx reste la méthode documentée autant que je sache ... ouverte aux corrections! – itowlson

+6

J'ai essayé ceci: var startInfo = new ProcessStartInfo (FileFullPath); startInfo.UseShellExecute = true; startInfo.Verb = "propriétés"; Process.Start (startInfo); ne semble pas fonctionner; Je reçois une exception Win32Exception "Aucune application n'est associée au fichier spécifié pour cette opération" –

Questions connexes