WIN32汇编语言教程:第10章 内存管理和文件操作 · 10.3 驱动器和目录(2)
lpFileSystemFlags也指向一个双字变量,函数在这里返回一些逻辑驱动器的属性标志,返回值可能是下面数值的组合:
● FS_CASE_IS_PRESERVED——文件系统在保存文件名的时候保持它的大小写(如DOS就不是这样,它把所有的文件名转换成大写后保存到目录区)。
● FS_CASE_SENSITIVE——支持区分大小写的文件名(在Windows中文件名不区分大小写,如Abc.exe和aBc.ExE指的是同一个文件)。
● FS_UNICODE_STORED_ON_DISK——允许存放Unicode格式的文件名。
● FS_PERSISTENT_ACLS——支持ACL(访问控制列表),ACL用于安全性管理,它是一个为个人或组委派或否认特定访问权限的条目列表。NTFS文件系统支持ACL,而FAT系统不支持。
● FS_FILE_COMPRESSION——支持文件压缩。
● FS_VOL_IS_COMPRESSED——支持卷压缩。
lpFileSystemNameBuffer指向一个字符串缓冲区,用来接收文件系统字符串,函数在这里返回类似于“FAT”、“FAT32”或“NTFS”类型的字符串,dwFileSystemNameSize参数指出了这个缓冲区的长度。
检测逻辑驱动器剩余空间的GetDiskFreeSpace函数也是一个常用的函数,它的用法如下:
invoke GetDiskFreeSpace, lpRootPathName,\ lpSectorsPerCluster,lpBytesPerSector,\ lpNumberOfFreeClusters,lpTotalNumberOfClusters
同样,参数lpRootPathName指向需要检测的驱动器根目录字符串,后面的参数指向一些双字变量,用来接收返回的数据:
● lpSectorsPerCluster参数——返回每簇的扇区数。
● lpBytesPerSector参数——返回每扇区的字节数。
● lpNumberOfFreeClusters参数——返回驱动器中未使用的簇的数量。
● lpTotalNumberOfClusters参数——返回驱动器中簇的总数。
驱动器的总容量可以通过算式计算出来:簇总数×每簇扇区数×每扇区字节数,驱动器中空闲的字节数则等于:未使用的簇×每簇扇区数×每扇区字节数。
10.3.2 目录操作
1. 创建和删除目录
创建目录使用CreateDirectory函数,例如:
szDir db ‘c:\dir1\dir2’,0 ... invoke CreateDirectory,addr szDir,NULL
这两句代码在c:\dir1目录下创建一个名为dir2的新子目录。如果创建成功,函数返回TRUE,否则返回FALSE。
在创建目录的时候要注意几个要点:首先是要创建目录的上层目录必须存在,上面的例子中,假如c:\dir1目录不存在,函数不会创建到dir2的目录;其次是与新建目录同名的目录或文件不能存在,假如c:\dir1目录中已经存在一个名为dir2的目录或文件,那么创建工作就会失败。由于文件名和目录名在磁盘目录区中的存放格式是一样的,惟一的不同是目录项的属性不同(在10.2.3节中,已经发现判别找到的目录项是文件还是目录的惟一办法就是检测FILE_ATTRIBUTE_DIRECTORY属性),所以,连同名文件的存在也是不允许的。
删除目录使用RemoveDirectory函数,删除上面创建的dir2目录的方法是:
szDir db ‘c:\dir1\dir2’,0 ... invoke RemoveDirectory,addr szDir
如果删除成功,函数返回TRUE,否则返回FALSE。
删除目录也要注意几个要点:首先,被删除的是参数中指出的最后一级目录,如前面代码只删除dir2目录,而不会将dir1目录和dir2目录一起删掉;其次,在删除目录之前必须删除目录中的所有文件以及子目录,函数无法删除一个不为空的目录;最后,函数执行以后目录是被“真正”删除掉了,不会像用手工删除一样还可以在回收站中恢复回来。
2. 一些特殊目录
这里列出了Windows操作系统中的一些特殊目录:
● 当前目录——所有未指定路径的文件名均默认使用这个目录。
● Windows目录——Windows操作系统的安装目录。
● 系统目录——Windows安装目录下存放系统文件的目录,Windows 9x下是System目录,Windows NT下是System32目录。
● 临时目录——存放临时文件的目录,系统可以在磁盘空间不足的时候自动删除里面的文件。
这些目录在编程的时候是经常需要检测的,如要编写系统程序的时候常常要把dll文件拷贝到系统目录或Windows目录中去;而要建立临时文件的时候最好使用系统指定的临时目录,以便自动回收使用的空间。Win32中专门设置了几个函数来获取这些目录的位置:
invoke GetCurrentDirectory,dwBufferSize,lpBuffer ;获取当前目录 invoke GetTempPath,dwBufferSize,lpBuffer ;获取临时目录 invoke GetWindowsDirectory,lpBuffer,dwBufferSize ;获取Windows目录 invoke GetSystemDirectory,lpBuffer,dwBufferSize ;获取系统目录
参数lpBuffer指向一个缓冲区,用来接收返回的路径字符串,dwBufferSize指出了缓冲区的大小,一般把缓冲区的大小设置为MAX_PATH。
这几个函数有些奇怪是:GetWindowsDirectory和GetSystemDirectory函数的参数和通常的习惯一致,把缓冲区指针lpBuffer放在前面,而GetCurrentDirectory和GetTempPath函数却把dwBufferSize参数放在前面,不注意的话很容易搞错;另外,GetTempPath函数返回的路径的最后竟然包括“\”,在笔者的Windows XP操作系统中,它的返回值是“C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\”,而其他3个函数返回的路径最后并不带“\”,读者在路径后面添加文件名的时候最好首先检测一下字符串的最后是不是已经包含了一个“\”字符,否则会构造出一个类似于“c:\temp\\abc.dat”之类的无效的文件名。
当程序运行的时候,默认的当前路径是执行程序所在的目录,但这不是绝对的,比如使用GetOpenFileName等函数弹出一个打开文件的系统对话框,用户在里面指定了其他目录后,当前路径就会被设置到那个目录中。
读者也可以自己调用SetCurrentDirectory函数修改当前路径:
szDir db ‘c:\dir1\dir2’,0 ... invoke SetCurrentDirectory,addr szDir
这几句代码将当前路径设置到“c:\dir1\dir2”目录中。
上页:第10章 内存管理和文件操作 · 10.3 驱动器和目录(1) 下页:第10章 内存管理和文件操作 · 10.4 内存映射文件(1)