⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 teach_sp_51.htm

📁 VC专题教程 -- 第一章 Internet相关开发 打包下载 --- 1.1 如何编写CGI程序 ------ 1.2 一种更亲切的CGI开发系统WinCGI ------ 1.3 利用ISAPI开
💻 HTM
字号:

<!-- LANGUAGE='JavaScript'>write_body();<-->
<!-- LANGUAGE='JavaScript'>write_bar();<-->



<table width=98% cellspacing="0" cellpadding="0" align=center><!--整体框架-->
<tr><td>

<table border=0 width="100%" cellspacing="0" cellpadding="2"><!--标记放置区域-->
<tr>
	<td width="30%" align="center" bgcolor="#8E8E8E" valign=middle><img src=../../img/brand_200_60.gif width=200 height=60 alt="LOGO1"></td>
	<td width="70%" align="center" bgcolor="#8E8E8E" valign=middle><!-- LANGUAGE='JavaScript'>write_ban();<--></td>
</tr>
<tr>
	<td colspan="2" bgcolor="#939393" align=center><font color=white>您当前位置</font> <a href=../../index.htm><font color=white>首页</font></a> <a href=../index.htm><font color=white>开发教程</font></a> <a href=index.htm><font color=white><font class=engul>Visual C++/MFC</font>专题讲座</font></a> <font color=white>5.1 磁盘文件的打开和关闭</font> <font color=white><!-- LANGUAGE='JavaScript'>write_command();<--></font></td>
</tr>
</table><!--标记放置区域 END-->

<table border=0 width=100% cellspacing="0" cellpadding="0">
<tr bgcolor="#F4F4F4">
<td><!-- article title begin here-->
<br>
<p align=center><big>5.1 磁盘文件的打开和关闭</big>
<p>本节主要讲述<a href=#file>磁盘文件的打开和创建</a>,在最后讲述一些对<a href=#dir>目录的操作</a>。
<p>在Win32下传统的ANSI C函数依然可以用来对函数进行操作,例如:fopen fread fwrite fclose,但M$推荐使用CreateFile,CreateFile函数的用途很多(我最开始时候被这个函数的多用途吓住了),可以打开和创建下面的设备文件:
<ul>
<li>Consoles 
<li>Communications resources 
<li>Directories (只能打开)
<li>Files 
<li>Mailslots 
<li>Pipes 
</ul>
<a name=file></a>关于管道的创建和打开已经在<a href=teach_sp_45.htm>上章4.5节</a>讲过了,本章主要讲如何对磁盘文件的打开和创建操作。
<pre>
HANDLE CreateFile(
  LPCTSTR lpFileName,                         // file name
  DWORD dwDesiredAccess,                      // access mode
  DWORD dwShareMode,                          // share mode
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
  DWORD dwCreationDisposition,                // how to create
  DWORD dwFlagsAndAttributes,                 // file attributes
  HANDLE hTemplateFile                        // handle to template file
);</pre>
文件名 lpFileName:文件名的最大长度为MAX_PATH,文件可以为UNC,例如:\\server\file_name可以指明网络上其他主机上的文件。
存取方法 dwDesiredAccess:可以通过指定参数表明打开文件读还是写,GENERIC_READ|GENERIC_WRITE表示一个文件进行读写。DELETE表示删除文件。
共享属性 dwShareMode:表明文件打开后是否允许文件以某种存取方式(通过指定参数dwDesiredAccess的值)再次被打开,
<ul>
<li>0 不允许文件再被打开
<li>FILE_SHARE_DELETE 允许其他进程在以后打开文件进行删除
<li>FILE_SHARE_READ  允许其他进程在以后打开文件进行读
<li>FILE_SHARE_WRITE 允许其他进程在以后打开文件进行写
</ul>
安全描述 lpSecurityAttributes:通过指定安全描述参数可以指定返回的句柄是否可以被子进程继承,如果设置为NULL则表明无法被继承。
<pre>
typedef struct _SECURITY_ATTRIBUTES { 
  DWORD  nLength; 
  LPVOID lpSecurityDescriptor; 
  BOOL   bInheritHandle; 
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES; </pre>
在结构中设置nLength = sizeof(SECURITY_ATTRIBUTES),lpSecurityDescriptor = NULL,bInheritHandle = TRUE就可以使子进程能够集成句
柄。
<p>dwCreationDisposition用来设置文件在存在或不存在时系统采用的方法,可能的取值为:
<ul>
<li>CREATE_NEW:创建新文件,当文件已经存在时函数会返回失败
<li>CREATE_ALWAYS:无论文件是否存在都创建新文件并且清楚原文件的所有属性
<li>OPEN_EXISTING:打开存在的文件,当文件不存在时函数会返回失败
<li>OPEN_ALWAYS:打开文件,当文件已经存在时函数会创建新文件
<li>TRUNCATE_EXISTING:打开文件并将文件截断为零,当文件不存在时函数会返回失败
</ul>
文件属性和参数 dwFlagsAndAttributes:通过这个参数来指定创建的文件属性和打开文件时的参数,文件属性可以是下面这些值的合并:<ul>
<li>FILE_ATTRIBUTE_NORMAL 普通文件,设置这个属性时其他属性都不会生效 
<li>FILE_ATTRIBUTE_ARCHIVE 归档文件 <li>FILE_ATTRIBUTE_HIDDEN 隐藏文件
<li>FILE_ATTRIBUTE_READONLY 只读文件   
<li>FILE_ATTRIBUTE_SYSTEM  系统文件   
<li>FILE_ATTRIBUTE_TEMPORARY 临时文件 。
</ul>
此外该参数还会指定文件操作的标记,可用的标记有下面这些:
<ul>
<li>FILE_FLAG_WRITE_THROUGH  使用WriteThrough模式,系统不会对文件使用缓存,文件的改变马上会被写入到磁盘  <li>FILE_FLAG_OVERLAPPED  使用异步文件操作模式 Win9X不支持异步操作  
<li>FILE_FLAG_DELETE_ON_CLOSE  文件被关闭后立即删除文件  <li>FILE_FLAG_RANDOM_ACCESS  说明对文件进行随机读写操作,用于暗示操作系统对该文件的缓存使用进行优化 
</ul>
文件模板 hTemplateFile:当指定文件模板的句柄时该文件模板的所有属性会被复制到当前创建的文件。
<p>CreateFile和ANSI C函数中fopen的比较:
<p>
<table width=90% border=1 align=center>
<tr><td width=20%>操作</td><td width=30%>fopen</td><td width=50%>CreateFile</td></tr>
<tr><td>打开读</td><td>fopen("a.txt","r")</td><td>CreateFile("a.txt",GENERIC_READ,0,NULL,
<br>OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)</td></tr>
<tr><td>打开写并创建</td><td>fopen("a.txt","w")</td><td>CreateFile("a.txt",GENERIC_WRITE,0,NULL,
<br>CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)</td></tr>
<tr><td>打开读写</td><td>fopen("a.txt","r+")</td><td>CreateFile("a.txt",GENERIC_WRITE|GENERIC_READ,0,NULL,
<br>OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)</td></tr>
<tr><td>打开读写并创建</td><td>fopen("a.txt","w+")</td><td>CreateFile("a.txt",GENERIC_WRITE|GENERIC_READ,0,NULL,
<br>CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)</td></tr>
</table>
<p>如果文件打开成功则返回文件句柄,否则返回INVALID_HANDLE_VALUE。通过GetLastError来获取错误信息。
<p>文件的关闭很简单,只需要用CloseHandle就可以关闭文件,当文件被关闭时所有缓存内数据都会被写入到磁盘。
<p>文件的删除可以使用下面的函数,并指明文件名
<pre>BOOL DeleteFile(
  LPCTSTR lpFileName   // file name
);
</pre>
<p>
<p><a name=dir></a>对于目录的创建可以使用:
<pre>
BOOL CreateDirectory(
  LPCTSTR lpPathName,                         // directory name
  LPSECURITY_ATTRIBUTES lpSecurityAttributes  // 安全描述 通常情况下设置为NULL
);
BOOL CreateDirectoryEx(
  LPCTSTR lpTemplateDirectory,               // template directory
  LPCTSTR lpNewDirectory,                    // directory name
  LPSECURITY_ATTRIBUTES lpSecurityAttributes // SD
);
</pre>
后一个函数可以创建一个和现有目录具有相同属性的新目录。
<p>如果要删除一个存在的目录可以使用
<pre>
BOOL RemoveDirectory(
  LPCTSTR lpPathName   // directory name
);
</pre>
上面这些函数的返回值都是BOOL类型,可以通过返回值判断是否执行成功。如果失败可以通过GetLastError得到错误信息。

<p>


                  <p align=center><a href=index.htm#charpter5>返回</a></p>
<p align=center><small>版权所有 闻怡洋 <a href=http://www.vchelp.net/><font class=engul>http://www.vchelp.net/<font></font></font></a></small></p>
</small>
	</td></tr><!-- article content end-->
	</table>
</td>
</tr><!-- article title end-->
</table>

</td></tr></table><!--整体框架 END-->



<!-- LANGUAGE='JavaScript'>write_tail();<-->


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -