四、Win32 API对文件操作的支持
1.文件的创建与打开
CreatFile 函数将创建或打开文件、管道、通信资源等对象,并返回一个读取该对象的句柄。
HANDLE CreaeFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttribiutes,
HANDLE hTemplateFile
);
第一个参数:lpFileName,用于创建或打开的对象的名称;
第二个参数:dwDesiredAccess,用于指定对对象的访问方式。包括:0、GENERIC_READ、GENERIC_WRITE。
第三个参数:dwShareMode,用于指定共享方式。包括:FILE_SHARE_DELETE、FILE_SHARE_READ、FILE_SHARE_WRITE。
第四个参数:lpSecurityAttributes,用于指定我们所创建的文件对象的访问权限,以及文件对象句柄能否被子进程所继承。当将其指定为NULL时,将对象设置为默认安全权限。通常在创建服务器端软件时使用这个参数,客户端使用较少。
第五个参数:dwCreationDisposition,指定如何创建文件。必须为:CREATE_NEW、CREATE_ALWAYS、OPEN_EXISTING、OPEN_ALWAYS、TRUNCATE_EXISTING中的一个。
第六个参数:dwFlagsAndAttribiutes,设置文件属性和标志。包括:FILE_ATTRIBUTE_ARCHIVE、FILE_ATTRIBUTE_HIDDEN、FILE_ATTRIBUTE_NORMAL、FILE_ATTRIBUTE_OFFLINE等等,我再此不全部列出。
dwFlagsAndAttribiutes参数可以包含其中的一个或多个。
第七个参数:hTemplateFile,指定具有GENERIC_READ访问方式的模板文件的句柄。如果为此从参数传递了一个文件句柄,那么CreateFile函数会忽略为所创建的文件设置的属性标志,而是用hTemplateFile相关联的文件的属性标志。要注意的是,hTemplateFile必须是使用GENERIC_READ方式打开的。而且,如果是打开一个现有文件,而不是创建一个新文件,则这个参数将被忽略。所以,这个参数有效的条件有二:1.创建新文件,2.给hTemplateFile参数传递的文件句柄必须使用GENERIC_READ方式打开。
2.文件的写入
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
第一个参数:hFile,指定要写入数据的文件的句柄。
第二个参数:lpBuffer,指向包含将要写入文件的数据的缓冲区的指针。
第三个参数:nNumberOfBytesWritten,指明要向文件中写入的字节数。
第四个参数:lpNumberOfBytesWritten,用来接收实际写入到文件中的字节数。
第五个参数:lpOverlapped,指向OVERLAPPED 结构体的指针。要想这个参数起作用,在CreateFile打开文件设置文件属性时要添加FILE_FLAG_OVERLAPPED标记,表明需要异步地访问这个文件。若没有这个标记,默认为以同步IO的方式访问这个文件。
实例:
HANDLE hFile;
hFile=CreateFile("5.txt",GENERIC_WRITE,0,NULL,CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwWrites;
WriteFile(hFile,"http://my.csdn.net/",strlen("http://my.csdn.net/"),
&dwWrites,NULL);
CloseHandle(hFile);
3.文件的读取
BOOL ReadFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
第一个参数:hFile,指定要读取数据的文件的句柄。
第二个参数:lpBuffer,指向包含将要接收文件的数据的缓冲区的指针。
第三个参数:nNumberOfBytesWritten,指明要从文件中读取的字节数。
第四个参数:lpNumberOfBytesWritten,用来接收实际读取到的字节数。
第五个参数:lpOverlapped,指向OVERLAPPED 结构体的指针。
实例:
HANDLE hFile;
hFile=CreateFile("5.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwReads;
char ch[100];
ReadFile(hFile,ch,100,&dwReads,NULL);
ch[dwReads]=0;
CloseHandle(hFile);
五、MFC对文件操作的支持
1. MFC中对文件操作的基类是:CFile。该类提供了无缓存的二进制的磁盘文件输入输出功能。其有三种形式的构造函数,其中之一为:CFile( LPCTSTR lpszFileName, UINT nOpenFlags );
其中第一个参数为指定文件的名称;第二个参数指定文件共享和访问的方式,访问方式可以设置一个或多个值的组合。
CFile类中还有很多方法,常用的包括:
Write:写入数据;
Read:读取数据;
Seek:将文件指针移动到指定的位置;
SeekToBegin:将文件指针放置到文件的开始位置;
SeekToEnd:将文件指针放置到文件的结尾处;
GetLength:获得文件的长度;
写入实例:
CFile file("6.txt",CFile::modeCreate | CFile::modeWrite);
file.Write("http://www.sunxin.org",strlen("http://www.sunxin.org"));
file.Close();
读取实例:
CFile file("6.txt",CFile::modeRead);
char *pBuf;
DWORD dwFileLen;
dwFileLen = file.GetLenth();
pBuf=new char[dwFileLen+1];
pBuf[dwFileLen[=0;
file.Read(pBuf,dwFileLen);
file.Close();
2. CFileDialog类
它是一个对话框类。
file.m_ofn.lpstrTitle="我的文件打开对话框";
file.m_ofn.lpstrFilter="Texr Files(*.txt)\0\0";
if(IDOK==file.DoModal())
{
CFile f(file.GetFileName(),CFile::modeRead);
char *puf;
DWORD dwFileLen;
dwFileLen = f.GetLength();
puf=new char[dwFileLen+1];
f.Read(puf,dwFileLen);
f.Close();
MessageBox(puf);
}
fileDlg.m_ofn.lpstrTitle="我的文件保存对话框";
fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
fileDlg.m_ofn.lpstrDefExt="txt";
if(IDOK==fileDlg.DoModal())
{
CFile file(fileDlg.GetFileName(),CFile::modeCreate | CFile::modeWrite);
file.Write("http://www.sunxin.org",strlen("http://www.sunxin.org"));
file.Close();
}