C#打开目录并选中文件(夹)的实现

C++实现打开文件打开所在文件的功能(附源码) 在使用IM软件将文件接收完成,或者使用下载软件将文件下载完成时,都会有打开文件打开文件坐在文件的入口,如下: 打开文件是直接将文件打开打开所在文件则是打开文件所在的目录选中文件。下面我们就来看看实现打开文件打开所在文件这两个功能的实现细节。 对于打开文件,我们只需要调用ShellExecute,传入“open”参数和要打开文件的完整路径即可,执行这句代码后,系统会启动适当的程序去打开这个文件。此处有个细节需要考虑一下,要判断ShellExecute AP... 阅读详情

 

 

 

没错,就是想实现像上图中点击“查找目标”按钮一样的功能,即是打开目录并选中文件(夹)。有人可能会问,使用explorer.exe程序加/select参数不是可以做到吗?当然,这是一种办法,不过,也许你更希望使用Windows中的某个API来实现,因为使用explorer.exe程序来实现会有些问题的。那么,Windows中哪个API可以做到呢?答案是shell32.dll中的SHOpenFolderAndSelectItems函数,关于它的详细信息可以查看MSDN,需要注意的是这个API要在Windows XP及以上操作系统才支持。

如果你希望使用VC来实现,那么网上也有很多例子,并且支持Windows XP以下的操作系统,可是我在网上找不到C#实现的例子,或许有我没有找到,所以只好自己动手,丰衣足食了。

首先,C#导入shell32.dll中的SHOpenFolderAndSelectItems函数:

 

        [DllImport("shell32.dll", ExactSpelling = true)]

        public static extern int SHOpenFolderAndSelectItems(

            IntPtr pidlFolder,

            uint cidl,

            [In, MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl,

            uint dwFlags);

VC中的一些数据类型,我们使用.NET中的IntPtr特定类型来代替行了,因为我们并不关心这些数据类型的数据,知道指针就OK了。SHOpenFolderAndSelectItems的第一个参数pidlFolder指你要查找的目标文件(夹)的PIDL,我们为了获取文件(夹)的PIDL,需要使用shell32.dll中的IShellLink接口。那么我们需要创建IShellLink接口的一个实例,需要使用到ole32.dll中的CoCreateInstance函数。创建的实例保存到指针,如下:

         [DllImport("ole32.dll", ExactSpelling = true)]

        public static extern int CoCreateInstance(

            [In] ref Guid rclsid,

            IntPtr pUnkOuter,

            CLSCTX dwClsContext,

            [In] ref Guid riid,

            [Out] out IntPtr ppv);

 

        public enum CLSCTX : uint

        {

            INPROC_SERVER = 0x1

        }

 

        Guid CLSID_ShellLink = new Guid("00021401-0000-0000-C000-000000000046");

        Guid IID_IShellLink = new Guid("000214F9-0000-0000-C000-000000000046");

 

        IntPtr ppsl = IntPtr.Zero;

        int result = CoCreateInstance(

            ref CLSID_ShellLink,

            IntPtr.Zero,

            CLSCTX.INPROC_SERVER,

            ref IID_IShellLink,

            out ppsl);

 

这样,ppsl变量就保存了IShellLink的一个实例对象,为了使用IShellLink接口中的方法,我们还需要定义IShellLink接口,下面是Unicode版本的IShellLink,名为IShellLinkW:

 

    [ComImport]

    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

    [Guid("000214F9-0000-0000-C000-000000000046")]

    public interface IShellLinkW

    {

        [PreserveSig]

        int GetPath(StringBuilder pszFile, int cch, [In, Out] ref WIN32_FIND_DATAW pfd, uint fFlags);

 

        [PreserveSig]

        int GetIDList([Out] out IntPtr ppidl);

 

        [PreserveSig]

        int SetIDList([In] ref IntPtr pidl);

 

        [PreserveSig]

        int GetDescription(StringBuilder pszName, int cch);

 

        [PreserveSig]

        int SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);

 

        [PreserveSig]

        int GetWorkingDirectory(StringBuilder pszDir, int cch);

 

        [PreserveSig]

        int SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);

 

        [PreserveSig]

        int GetArguments(StringBuilder pszArgs, int cch);

 

        [PreserveSig]

        int SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);

 

        [PreserveSig]

        int GetHotkey([Out] out ushort pwHotkey);

 

        [PreserveSig]

        int SetHotkey(ushort wHotkey);

 

        [PreserveSig]

        int GetShowCmd([Out] out int piShowCmd);

 

        [PreserveSig]

        int SetShowCmd(int iShowCmd);

 

        [PreserveSig]

        int GetIconLocation(StringBuilder pszIconPath, int cch, [Out] out int piIcon);

 

        [PreserveSig]

        int SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);

 

        [PreserveSig]

        int SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, uint dwReserved);

 

        [PreserveSig]

        int Resolve(IntPtr hwnd, uint fFlags);

 

        [PreserveSig]

        int SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);

    }

 

        [Serializable, StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode), BestFitMapping(false)]

        public struct WIN32_FIND_DATAW

        {

            public uint dwFileAttributes;

            public FILETIME ftCreationTime;

            public FILETIME ftLastAccessTime;

            public FILETIME ftLastWriteTime;

            public uint nFileSizeHigh;

            public uint nFileSizeLow;

            public uint dwReserved0;

            public uint dwReserved1;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]

            public string cFileName;

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]

            public string cAlternateFileName;

        }

 

        [Serializable, StructLayout(LayoutKind.Sequential)]

        public struct FILETIME

        {

            public uint dwLowDateTime;

            public uint dwHighDateTime;

        }

 

上面的定义可以参照VC中的IShellLinkW定义得到。那么,我们就可以把前面创建的IShellLink实例对象转化为IShellLinkW了:

 

IShellLinkW psl = Marshal.GetObjectForIUnknown(ppsl) as IShellLinkW;

 

然后设置你想获取PIDL的目标路径,以C:/WINDOWS/regedit.exe为例:

 

psl.SetPath(@"C:/WINDOWS/regedit.exe");

 

IntPtr pidl = IntPtr.Zero;

psl.GetIDList(out pidl);

 

这样,我们就拿到了C:/WINDOWS/regedit.exe的PIDL,保存在IntPtr类型的pidl变量中。接下来就是让SHOpenFolderAndSelectItems方法使用这个PIDL了:

 

SHOpenFolderAndSelectItems(pidl, 0, null, 0);

 

执行了上面这句代码后,如无意外,Windows就会打开C:/WINDOWS目录,并且选中regedit.exe文件了。最后要做的事情就是清理内存和释放对象:

 

Marshal.FreeCoTaskMem(pidl);

Marshal.Release(ppsl);

 

主要的功能实现就已经讲完了,如果你要测试,也不难,把上面讲到过的代码合并起来就应该可以执行了。为了方便使用,你可以把它写成一个方法,哪里需要就调用一下即可。

C#打开指定目录打开指定目录选中指定文件打开指定文件 一、实现内容 1.1、实现的功能 想要实现: ①打开指定目录; ②打开指定目录选中指定文件; ③打开指定文件 1.2、实现的效果 二、实现操作 /// <summary> /// 打开目录 /// </summary> /// <param name="folderPath">目录路径(比如:C:\Users\Administrator\)</param> 阅读详情

相关推荐

VC++ 文件路径选择与文件打开两种实现方法及示例

本文还有配套的精品资源,点击获取 简介:在VC++编程中,文件路径的选择和特定文件打开是常见的用户交互需求。本教程详细介绍了两种不同的方式实现文件路径选择对话框,包括使用 CFileDialog 类和 OPENFILENAME 结构结合 GetOpenFileName 函数。此外,还讲解了如何使用 IShellItem ...

weixin_42584586的博客 2256

SHOpenFolderAndSelectItems

SHOpenFolderAndSelectItems——打开目标文件所在文件选中目标文件 http://blog.csdn.net/dahual/archive/2011/05/10/6408163.aspx

打开文件(资源管理器),选中多个文件文件

打开一个资源管理器选中多个目标(文件文件)。在国内网站搜索很久没有找到相关代码,后来在一个网站上找到了使用SHOpenFolderAndSelectitems函数来打开资源管理器,但是只能选中一个目标,因此在他的基础上测试修改实现了所需功能。

SHOpenFolderAndSelectItems的用法

  LPITEMIDLIST  pidl;   LPCITEMIDLIST cpidl;   LPCITEMIDLIST cpidl1;   LPSHELLFOLDER pDesktopFolder;   char          szPath[MAX_PATH];   OLECHAR       olePath[MAX_PATH];   ULONG         chEaten;   ULO

ssn221的专栏 6966

SHOpenFolderAndSelectItems——打开目标文件所在文件选中目标文件

<br />原文:<br />SHOpenFolderAndSelectItems——打开目标文件所在文件选中目标文件<br />http://www.vbgood.com/thread-103716-1-1.html<br /> <br />很多软件都有类似 taskmgr 的 打开文件位置 的功能。用vb究竟怎么实现,这个想法之前就有了,只是没有时间去探究。搜了一下,这方面vb的资料很少,一个链接:http://www.vbgood.com/thread-96229-1-1.html 所以花

dahual的专栏 2999

C# API 打开目录选中文件()实现

C#打开目录选中文件()实现<br />  很久之前想把这个写下来的,谁知道用Firefox在博客园上在线编辑快完成时浏览器死掉,郁闷之下没有写了。今天突然想起,随便记录一下吧。<br /> <br />  本文想讲的内容,如果你还不是很清楚,可以看看下图:<br /> <br /><br /> <br /> <br />  没错,就是想实现像上图中点击“查找目标”按钮一样的功能,即是打开目录选中文件()。有人可能会问,使用explorer.exe程序加/select参数不是可以做到吗?当然,这是

火山赵哥的专栏 791

C# 打开指定目录定位到文件

1. 打开文件: System.Diagnostics.Process.Start(FilePath); 打开文件中某个文件: System.Diagnostics.Process.Start(FilePath+"/"+FileName); 打开文件选中单个文件: System.Diagnostics.Process.Start("Explorer", "/sele...

雨中深巷的油纸伞 1万+

c#: 打开文件选中文件

一、常规方法 给定一个文件路径,打开文件定位到文件,通常所用shell命令为:explorer.exe/select,filepath。 c#以进程启动之为: if (File.Exists(fileName)) { Process.Start("explorer", "/select,\"" + fileName + "\""); } 此命令对于一般文件...

weixin_30367945的博客 1679

C#打开文件选中文件

/// <summary> /// 打开路径定位文件 /// </summary> /// <param name="filePath">文件绝对路径</param> [DllImport("shell32.dll", ExactSpelling = true)] private static extern void ILFree(IntPtr pidlList); [DllImport("shell32.dll", CharSet = CharS...

GreAmbWang的博客 544

打开文件所在目录

通常情况下,我们用ShellExecute就可以实现打开指定文件所在的目录选中文件”的功能,代码如下所示: CString str = _T("/select, E:\TestDir\test.txt"); ShellExecute( NULL, _T(“open”), _T(“explorer.exe”), str, NULL, SW_SHOWNORMAL ); 如上所示,使用“/select,“参数(注意:“/select”参数后面的逗号不能丢)。但用ShellExecute实现的功能是有问..

liusarzn的博客 1194

SHOpenFolderAndSelectItems - 实现查找目标

SHOpenFolderAndSelectItems - 实现查找目标 2009年08月11日 星期二 01:02 睡觉之前发点代码,今天发现R3下新的一个结束进程的方法,原理跟内存清零差不多,不过速度快多了(目前看到的那些清零的R3源码,连个判断都懒得加,速度太慢了...),哎,R3下拿不到句柄的话说这么多也就没用了. 不知道查找目标

我用CV我自豪。 1575

WindowsShellExcute或者SHOpenFolderAndSelectItems 使用explorer.exe可能失败

ShellExecute(NULL,NULL,explorerPath.c_str(),fmt.str().c_str(),NULL,SW_HIDE);;

seiferHu的专栏 2318

用VC6.0实现快捷方式中的查找目标功能

  最近写一个开发辅助工具,在这个过程要做一个类似文件快捷方式中查找目标的功能,先查MSDN98,大家不要见笑,我现在一直都用它,没有相应的API,后又. Net 2003中的MSDN,找到了可以实现该功能的API,SHOpenFolderAndSelectItems()函数,它的原型如下:  (具体用法参考MSDN)“Opens a Microsoft® Windows® Explorer wi

fxpopboy的博客 1032
上一篇: Windows Mobile 6.5 Widget - 有个Widget
下一篇: Bug管理的流程和几个重点
aptentity
博客等级 码龄20年 54粉丝 40原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值