终于把《windows 程序设计》看了三百多页(三分之一),在看《windows 程序设计》第九章时, HEAD程序代码中有个疑问,具体问题如下:
代码为:
szBuffer [lstrlen (szBuffer) - 1] = '/0' ;
// If setting the directory doesn't work, maybe it's
// a drive change, so try that.
if (!SetCurrentDirectory (szBuffer + 1))
{
szBuffer [3] = ':' ;
szBuffer [4] = '/0' ;
SetCurrentDirectory (szBuffer + 2) ;
}
....(省略代码)
这个szBuffer+1 是什么意思? szBuffer[3], szBuffer[4]为什么这么设置?
解答:
这是LB_DIR影响的结果造成的。
1.如果是文件,列表中的一项就显示为文件名;
2.如果不是文件,就可能为文件夹或者驱动盘。
本文探讨的是属于第二种情况,即为不是文件。szBuffer列表一项的字符串,它有3种可能:
[..] //上一层目录
[foldername] //文件夹名称,如[world],一个名为world的文件夹
[-driver-] //驱动盘名称,如[-c-],c盘
举个例子:
如果你选中的是一个叫world的文件夹,则szBuffer内容为[world],通过 szBuffer [lstrlen (szBuffer) - 1] = '/0' ; 得到[world/0
if (!SetCurrentDirectory (szBuffer + 1)) 是判断当前目录是否为文件夹。从szBuffer+1开始后面的字符串为路径,即为world/0。
把world设置为当前文件夹,设置成功,判断不成立。跳到省略号的代码。
另一个例子:
如果你选中的是一个c盘,则szBuffer内容为[-c-],通过 szBuffer [lstrlen (szBuffer) - 1] = '/0' ; 得到[-c-/0
if (!SetCurrentDirectory (szBuffer + 1)) 是判断当前目录是否为文件夹。从szBuffer+1开始后面的字符串为路径,即为-c-/0
它不是文件夹,所以设置不成功,判断成立,进入括号部分,
通过szBuffer [3] = ':' ;
szBuffer [4] = '/0' ;
把szBuffer从[-c-/0 变为 [-c:/0
从szBuffer+2开始后面的字符串为路径,所以用 SetCurrentDirectory (szBuffer + 2) ;把c:/0设置为当前路径。
用户377235 2012-12-7 15:40