刚加入博客园。虽然以前也经常在园子里晃悠,但只记得欣赏大牛们的大作了,从来没灌过水。这算是我的处女贴,权当是给园子增加流量了。
毕业走出校门,找了份编程的差事。
刚一上岗,就接到项目组长分派的任务:用Win32 API编程实现Windows XP中FAT32格式的文件夹只读共享,为啥要强调是FAT32格式呢?原来在我来之前,现在这个项目的老版本里已经实现了NTFS格式的文件共享,现在是应客户的要求添加对FAT32格式的支持。
估计是项目组长认为这个问题实在是太简单了,已经有了现成的葫芦,照个画个瓢就行了,这种低级的任务也只有我这个新来的菜鸟值得花功夫去弄一下。
我刚开始也认为这个任务应该不难,虽然我绝对是个Win32 API编程的菜鸟,以前从来没用接触过这东西。一方面是在我以前的编程任务中用不着,另外也是没胆量碰这东西,光是一堆字符串转换就把我给晕死了。
好了,废话少说,开始谈正事。
首先说下Windows操作系统下NTFS和FAT32文件格式在文件共享,读写权限设置方面的区别,简单点说就是:
为了更直观的表达这些意思,可以看下下面的示意图:
首先,取消掉Windows XP默认的“使用简单文件夹共享”,再分别查看FAT32分区和NTFS分区中文件夹的“属性”对话框:
左侧的对话框为FAT32格式的,右侧的为NTFS格式的,可见后者比前者多了一项:安全。
打开两个对话框中都有的“权限”,再打开NTFS属性对话框中的“安全”:
这就是我们通过Windows UI设置访问权限的地方了,左边的权限仅对网络共享控制器作用,右边的属于NTFS特有的访问控制功能,对于本地用户访问和网络访问都有效。
以上演示的是通过windows UI设置权限的方法,另外,对于我们这些吃编程饭的人来说,还有必要知道有没有相应的DOS命令来实现同样的功能。对于左侧的设置网络访问权限的功能,我还没有找出相应的命令(要是很容易找到这样的命令,我就不在这里灌这桶水了:));对于右侧的设置NTFS访问权限的功能,有一个专用的DOS命令可以使用:cacls,用法请参考DOS帮助或参考MS的资料:http://support.microsoft.com/kb/318754/
说了这么多,貌似还是没有切入正题,我想说的是该怎么编程啊,暴汗~~
先说下如何用API编程实现NTFS的文件夹共享:
这就是项目中老版本所采用的方法,从完成后的代码上看,还是比较简单明了的,思路上没有拐多大弯(典型的事后诸葛亮,别人不知道花了多少精力,走了多少弯路才找到这个解决方案,然后把写好的代码拿给你看,你看到代码行数并不算多,就说:这么简单啊~~)。
对于FAT32分区中文件夹,cacls命令是不起作用的,这个命令专用于NTFS格式下的文件和文件夹。也就是说上面这种解决方法的第2步不能用了,那么现在只能使用NetShareAdd()函数添加文件共享。调用此函数后如果不做其他设置,网络用户可以访问共享文件夹,但拥有完全控制权限(这是默认的共享权限设置),而在实际项目中我们希望能够编程控制读写权限。在NTFS分区中,我们还有NTFS文件系统的访问控制功能罩着,在FAT32分区中就只能依赖于操作系统文件夹共享自身的权限设置功能了。
现在开始切入核心问题了,如何编程设置文件夹共享的读写权限?
DOS命令我是不指望了,至少到目前我还没找到能实现这一点的命令;只能靠API,不过一开始,NetShareAdd()这个API就迷惑了我很长时间,晕死~~
NetShareAdd函数有一个参数:LPBYTE buf,是指向一个结构体的指针,如果将level参数设为2,则buf所指结构体的定义如下:
注意其中的一个成员:DWORD shi2_permissions,饿滴神啊,莫非这就是我的救星?也来的太容易了吧!?
但之后反复而痛苦的试验告诉我,actually,It doesn't work!!!无论将这个家伙设成多少,对于函数的执行效果都没什么影响。在CSDN,MSDN,cnblog(呃,貌似园子里没功夫讨论这种鸡毛蒜皮的小问题)上搜索,到处都是关于这个参数的用法的疑问,以及求教如何实现FAT32文件夹只读共享的帖子,后来在MSDN的一个角落里看到说对于不支持user level的操作系统,此参数无效……
希望再次落空,此时,我,一个刚接触Win32 API一个半星期的菜鸟,已经在这个“小问题”上花费了一个星期的时间。此时还真有些诚惶诚恐的感觉,这么简单的问题,搞了一个星期的都没个结果,真应该把你给T了,不过幸好老板没有将我的恐惧转化为他的行动,再次暴汗~~
没办法,只能硬着头皮找其他的路子了。经过反复的找资料,反复的试验,反复的失败,然后再反复的找资料,orz,总算是找到设置共享权限的解决方法了,具体过程还是留给下个帖子吧(我的处女贴就这么点内容,怎么写了这么长时间?)
ps:这里怎么在Normal模式下让两张贴图并排显示?我搞了老半天才在在HTML下弄好,晕~~