MFC中创建目录的相关问题(LPSECURITY_ATTRIBUTES隐藏) - 小众知识

MFC中创建目录的相关问题(LPSECURITY_ATTRIBUTES隐藏)

2015-11-26 03:13:13 苏内容
  标签: 创建/目录/MFC
阅读:5680

在编写录音机小程序的时候,碰到了一个创建文件目录的问题。针对在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"));

  }

 }
这样就完成了我们所需要的目录的创建。接下来我们就要直接编写文件并且直接对文件进行打开、关闭、读、写等操作。关于文件操作后续再做详细介绍。

(完)

扩展阅读
相关阅读
© CopyRight 2010-2021, PREDREAM.ORG, Inc.All Rights Reserved. 京ICP备13045924号-1