在编写录音机小程序的时候,碰到了一个创建文件目录的问题。针对在MFC中创建目录做一个小结。先以这个录音程序的实现为例说明。
在录音结束后要保存生成的声音文件,我想将每一次录音生成的声音文件都存储到系统当前目录Debug下的文件夹RecordVoice中。因此在录音结束的消息响应函数中需要添加相应的代码,实现:
1.如果Debug目录下没有文件夹Record(第一次运行程序通常是没有的),那么需要先创建一个;
2.如果Debug目录下已经有文件夹Record(除第一次外只要不手动删除这个文件夹,通常是有的),那么只需要往这个文件夹下存入声音文件即可。
也就是说,在创建以及操作文件以前,我们要查看文件要保存的目录有没有存在,如果不存在要创建。
在程序中添加下面的代码即可:
if (!(GetFileAttributes(PROGRAM_PATH)==FILE_ATTRIBUTE_DIRECTORY))
{
if (!CreateDirectory(PROGRAM_PATH,NULL))
{
AfxMessageBox(_T("Make Dir Error"));
}
}
其中,PROGRAM_PATH是当前系统到存储声音文件所属文件夹的路径(这里是...\Debug\Record),关于PROGRAM_PATH的获取在前面的博文 MFC当前系统目录的获取 中已经做过了详细的介绍,这里就不再重述。
现简要地介绍一下GetFileAttributes和CreateDirectory 这两个函数在MFC中的使用情况。
1、GetFileAttributes
函数原型:
DWORD WINAPI GetFileAttributes( __in LPCTSTR lpFileName );
函数参数:
lpFileName [in] :文件或目录的名字,对于ANSI版本,名字不能大于MAX_PATH。
函数返回值:
如果函数成功,返回值包含文件或目录的属性。
如果函数失败,返回值是INVALID_FILE_ATTRIBUTES。
注:在MSDN中,文件总共有15种属性,根据磁盘的分区格式不同,文件的属性也会不同。现在针对GetFileAttributes 函数的返回值做以下整理:
表1-1 文件属性表
返回字段
返回值
属性类型
FILE_ATTRIBUTE_READONLY
1
只读
FILE_ATTRIBUTE_HIDDEN
2
隐藏
FILE_ATTRIBUTE_SYSTEM
4
系统
FILE_ATTRIBUTE_DIRECTORY
16
目录
FILE_ATTRIBUTE_ARCHIVE
32
存档
FILE_ATTRIBUTE_DEVICE
64
保留
FILE_ATTRIBUTE_NORMAL
128
正常
FILE_ATTRIBUTE_TEMPORARY
256
临时
FILE_ATTRIBUTE_SPARSE_FILE
512
稀疏文件
FILE_ATTRIBUTE_COMPRESSED
1024
超链接或快捷方式
FILE_ATTRIBUTE_COMPRESSED
2048
压缩
FILE_ATTRIBUTE_OFFLINE
4096
脱机
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
8192
索引
FILE_ATTRIBUTE_ENCRYPTED
16384
加密
FILE_ATTRIBUTE_VIRTUAL
65536
虚拟
注:这张表中的数据是从网上搜集整理的,返回值没有8不是我漏掉了,好像搜集了很多都没有8,具体原因不详。
红色标记的属性为Windows系统中文件的公有属性,其中“只读”、“隐藏”、“系统”、“存档”为文件的四种基本属性。compressed,content_indexed,encrypted只存在于NTFS分区中。文件去掉全部属性后(四种基本属性),将自动标记为normal。同时具有system和hidden属性的文件会在系统中彻底隐形,这也是病毒常用的伎俩。commpressed和encrypted不能共存。默认情况下文件都有content_indexed属性。
2、CreateDirectory
函数原型:
BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes );
lpPathName:文件夹名称;
lpSecurityAttributes:安全属性,一般设置为NULL即可。如果正确创建,返回值为1,如果没有正常创建文件夹,则返回0。特别的:该函数每次调用时都只能创建一级文件夹,即文件夹中不能再包含子文件夹。当希望创建含有子文件夹的文件夹时,可以先使用该函数创建一级文件夹,然后再使用该函数在一级文件夹下创建子文件夹。如:
希望创建:d:\\TEST\\temp,示例如下:
CString str = “d:\\TEST”;
CreateDirectory(str, NULL);
str = str + \\temp;
CreateDirectory(str, NULL);
注意:这里要用“\\”第一个表示转义字符,第二个才是目录符号。
综合利用以上两个函数的例子如下:
if (!(GetFileAttributes(PROGRAM_PATH)==FILE_ATTRIBUTE_DIRECTORY))
{
if (!CreateDirectory(PROGRAM_PATH,NULL))
{
AfxMessageBox(_T("Make Dir Error"));
}
}
这样就完成了我们所需要的目录的创建。接下来我们就要直接编写文件并且直接对文件进行打开、关闭、读、写等操作。关于文件操作后续再做详细介绍。
(完)