编程 C# 关于GetAttributesOf (IShellFolder接口里的函数,懂编程的人不会不知道)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程 C# 关于GetAttributesOf (IShellFolder接口里的函数,懂编程的人不会不知道)相关的知识,希望对你有一定的参考价值。

看下面的代码:
public void Create_node(ljp_F_Struct F_Struct)

List<ljp_F_Struct> LjpsStruct = new List<ljp_F_Struct>();
IEnumIDList ForderList = null;
uint IsSuccess = F_Struct.F_ISHellFoler.EnumObjects(IntPtr.Zero, SHCONTF.FOLDERS, out ForderList);
IntPtr F_pidl = IntPtr.Zero;
int celt = 0;
if (IsSuccess == 0)

while (ForderList.Next(1, out F_pidl, out celt) == 0 && celt == 1)

if (F_pidl != IntPtr.Zero)

ljp_F_Struct temp_F_Struct = new ljp_F_Struct();
temp_F_Struct.M_PIDL = F_pidl;
temp_F_Struct.PIDL = API.ILCombine(F_Struct.PIDL, F_pidl);
SFGAO temp_ = new SFGAO();
F_Struct.F_ISHellFoler.GetAttributesOf(0,new IntPtr[]F_pidl, ref temp_);
SHFILEINFO temp_S = new SHFILEINFO();
API.FileInfo(temp_F_Struct.PIDL, 1, out temp_S, 0, SHGFI.ATTRIBUTES | SHGFI.DISPLAYNAME |
SHGFI.PIDL | SHGFI.SMALLICON);
temp_F_Struct.text = temp_S.szDisplayName;
temp_F_Struct.Icon = temp_S.iIcon;
LjpsStruct.Add(temp_F_Struct);




上面是一个父文件夹获取子文件夹 其中那个ljp_F_Struct 是一个结构,我定义的一个文件夹数据结构对象
请看到 F_Struct.F_ISHellFoler.GetAttributesOf(0,new IntPtr[]F_pidl, ref temp_);
GetAttributesOf 函数 (F_ISHellFoler 是IShellFolder接口对象)
现问问题是GetAttributesOf 最后一个参数 ref tmep_ 是 SFGAO枚举实例,上面代码里有,这个对象如何定义,只是new而以吗还有有别的,在来有SHFILEINFO结构里的dwAttributes 属性在实例中得出来Uint 类型一个数字,如何知道他代表什么(我想应该是属性,不过应该是一个(|)运算得出来的结果)
有哪位高手知道的吗我是个C#新手
在运用API 里的东西还不是很高手呀,知道的还不是很多,msdn里说的又少,网上又少

我在百度里也是新手,平时很少问,都是自己搞定,现在碰到一个自己认为大问题上网又找不到,没什么分呀,请原原谅呀

在这里谢谢了!!!
哦在说一点就是:我想问的是 GetAttributesOf 函数,还有就是SHFILEINFO结构里的dwAttributes 的值如何知道代表什么,也就是代表SFGAO枚举 中的哪个,因为dwAttributes 的值是指向SFGAO枚举那里的,只不过是他是一个Uint而不是SFGAO枚举!!!!拜托了!!在C++ VB 中是通用的,原型是通用,就是没有代码实例!!
2011-12-3 13:14 latentguling
追问不行了,没分了,
没闭要去争论呀,大家又不是一天两学编程,知道是什么就可以了,有机会向你请教请教,,只是好像我们都跑题了而以!!问题一点也没解决呀,对吧!!

参考技术A 如果你如果想追求快,我给你指一个方向,剩下的事情你自己去解决,这样你学到的也会更多。
就是参考C++ 或者 VB 是如何用你说的这个函数,或者类似的功能如何实现。
如果是C++的代码,在C#里面可以用unsafe来写,效率与C++不相上下追问

C++也没有这个!!!你有代码呀!! 两个语#是没办法和用,当然可以看对方如何用,在自己改这样才,而不是你说的C++代码在C# 用unsafe ,unsafe 在c#中只对一些不安全代码才用到的,很少用到吧!! 可能我没用过你那样的方法,f我可能很无知,在我学C#中没见过你那样的方法,是调用DLL还是什么的,如何你有代码,能发一点代码看一下吗,谢谢了!!!

追答

我两段类型,一种是调用API,一种是不安全代码(unsafe),不过你只是看看用法,C++也没有你说的那种,那你难道不考虑有没有找错资料了?

//这是调用DLL的,应该很眼熟了吧
[DllImport("kernel32.dll")]
private static extern int DeviceIoControl(uint hDevice,
uint dwIoControlCode,
ref SENDCMDINPARAMS lpInBuffer,
int nInBufferSize,
ref SENDCMDOUTPARAMS lpOutBuffer,
int nOutBufferSize,
ref uint lpbytesReturned,
int lpOverlapped);

//这是不安全代码,执行效率与C++不相上下
private static Bitmap Light1(Bitmap bmp, int Light)

if (Light 255) throw new Exception(@"亮度值始终是-255~255之间数字.");
if (bmp == null) throw new Exception(@"参数'bmp'必须是一个包含图像的Bitmap对像.");
//int StartTime = Environment.TickCount;
int w = bmp.Width; int h = bmp.Height;
int pix = 0;
BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe

byte* p = (byte*)data.Scan0;
int offset = data.Stride - w * 3;
for (int y = 0; y < h; y++)

for (int x = 0; x < w; x++)

for (int i = 0; i < 3; i++)

//太长了,这里省掉了

p += 3;

p += offset;



bmp.UnlockBits(data);
//System.Diagnostics.Debug.WriteLine(@"调节(亮度:" + Light + @")处理用时(ms):" + (Environment.TickCount - StartTime));//输出此算法所用时间(毫秒)

return bmp;

追问

DeviceIoControl 函数是操作设备的东西,感觉是说东讲西(不好意思呀),而你的这个也不在C++里的东西是API(谁知道微软用什么写的,可能是C++),unsafe 是对不安全代码,而不是C++代码(这是你刚才说的,可能我不明白你的吧,有点误会不在见怪),感觉你说的和你第一次说的有点不对呀??? ,,,,unsafe我还不如何用try cach 这样还知道什么错,呵呵,呆呆呆呆呆,还是感谢你的回答的!!希望能对题!!Thank you

追答

unsafe代码里面写的是直接操作内存之类的代码,所以叫不安全代码,因为C#里面都讲安全点,别总给出错,所以写这类代码,都是类似C C++的代码,是说类似,什么方面类似?直接对内存进行操作。而不是c#这样绕一大圈,又是类,又是接口的麻烦,
而API,是调用别人预先写好的东西,就叫API调用,至于这个API是什么语言开发的,你看它调用的是哪个DLL吧,比如user32.dll 就是系统的,整个系统的东西你说它会是什么开发的呢?不要太偏执比较好。

不可能直接写C++代码的。
至于你所说的try catch完全是多余的担心,你里面照常写代码就行了,它只是一个作用域,表示说 内的这段代码是不安全的,给我注意点运行哈。

追问

说的是,unsafe确实是这样的,呵呵 !!
就有点不同意,先是try catch 不是说多余的担心,你上面说到C#到处讲安全,那么try catch 和unsafe不是差不多吗,不知道你用没用过,在C#中try catch可以说是常用的,这样不是可以使程序不易死机吗,所以我不同意你说的,还有就是user32.dll 是系统的东西,是,不过他也是个类库,也是要语言来写的不是吗,C 或C++或两个一起,有部分应该是用C#的(对WIN7) ,还有一个作用域 没字写了

追答

调用API是很单纯的,就是直接对这个DLL的某个位置的函数进行调用,最多就是字符串,帮你转一下,类似帮你互通一下,别的真的没有什么的。

unsafe跟trycatch 不是一回事,
unsafe意思是讲我这段代码呢是为了高效,直接操作了指针之类的东西,容易凡事涉及内存 指针之类的东西,直接去操作,编译器都会给出提示说这是不安全的代码,要你加个标志,

参考技术B 汗啊,我发现我才是新手!追问

相互学习一下呀!

追答

去csdn问问,那里牛多,呵呵

追问

网上我都找过,IShellFolder 获取子文件夹是很多,不过那个GetAttributesOf一个也没有,MSDN里只也有那个原型 CSDN也查过,没有关于这个的,所以就上百度上看一下又没有高手 ,C#我都是自学的,没什么老师,都是上网查的!!不懂就问呀!!!

追答

可以用DirectoryInfo.GetDirectories()方法获取子文件夹,它也有获取属性的方法。

追问

的确这个也是可以的
这个是。net类库里的,I/O里的东西速度 很慢,而且得到的不全,还有那个ICON 就是图标获取的代码要比API的慢,又多,性能损失很大呀,不是很想呀,我写的软件比较追求快呀,所以我比较喜欢用多线程,在说,说句大话,用I/O空间感觉没什么技术含理,MSDN说的明明白白的,一看就会呀,不然我就不用上这里问了!!呵呵 呆

追答

呵呵,赞!

本回答被提问者采纳

以上是关于编程 C# 关于GetAttributesOf (IShellFolder接口里的函数,懂编程的人不会不知道)的主要内容,如果未能解决你的问题,请参考以下文章

《C#高级编程》读书笔记:关于数组

关于C#异步编程的建议

我用C#进行winform编程,关于progressBar的用法

关于c# winform 编程的,怎么弄提示类似“加载中”的小窗口

C#编程,关于基类和派生类

C#网络编程基础之进程和线程详解