关于写文件(系统API函数&CFile类)
2008-10-15 10:19
281 查看
写文件是编程中很常用的手段。我们通常可以利用系统提供的API函数CreateFile去创建或打开一个文件(是创建还是打开在参数中可以设置)
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
然后如果返回的句柄不是INVALID_HANDLE_VALUE时就代表打开或创建成功了。然后利用可以写文件和读文件了
BOOL WriteFile(
HANDLE hFile, //CreateFile反回的句柄
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
BOOL ReadFile(
HANDLE hFile, ////CreateFile反回的句柄
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
其中还有几个很有用的函数比如
BOOL SetEndOfFile( //把文件目前的Pointer挪到文件尾
HANDLE hFile
);
DWORD SetFilePointer( //设置文件目前的Pointer
HANDLE hFile,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod
);
此外还有系统几个函数比如:
BOOL SetFileAttributes( //设置文件属性
LPCTSTR lpFileName,
DWORD dwFileAttributes
);
BOOL GetFileTime( //取得文件时间
HANDLE hFile,
LPFILETIME lpCreationTime,
LPFILETIME lpLastAccessTime,
LPFILETIME lpLastWriteTime
);
BOOL SetFileTime( //设置文件时间
HANDLE hFile,
const FILETIME* lpCreationTime,
const FILETIME* lpLastAccessTime,
const FILETIME* lpLastWriteTime
);
以上是利用系统的API函数来实现读写文件的方法
MFC中有一个封装了以上这些API函数操作的类叫做CFile类。一般对文件操作方法都有。而且更加简单易用。下面举一个小例子
//创建一个结构体记录,定义学生基本信息结构
typedef struct _CStudentData
{
TCHAR xsbh[20]; //学生编号
TCHAR xsxm[20]; //学生姓名
TCHAR xb[20]; //学生性别
}CStudentData;
//定一个该结构体的一个实例
CStudentData studentsdata;
//给这个结构体实例附值
CString m_xsbh = L"01";
CString x_sxm = L"李楠";
CString x_b = L"男";
wcscpy(studentsdata.xsbh,m_xsbh);
wcscpy(studentsdata.xsxm,x_sxm);
wcscpy(studentsdata.xb,x_b);
const LPCTSTR STUDENTFILEPATH = _T("\\Storage Card\\student.dat");
//创建数据库
CFile stuFile;
if (!stuFile.Open(STUDENTFILEPATH,CFile::modeCreate|CFile::modeWrite))
{
AfxMessageBox(_T("创建数据库失败"));
}
stuFile.Close();
//写入文件
stuFile.Open(STUDENTFILEPATH,CFile::modeRead | CFile::modeWrite);
stuFile.SeekToEnd();
stuFile.Write(&studentsdata,sizeof(studentsdata));
stuFile.Close();
//试着读取出来
if (stuFile.Open(STUDENTFILEPATH,CFile::modeRead))
{
do
{
dwRead = stuFile.Read(&studentsdata,sizeof(studentsdata));//每次读出一条记录。
if (dwRead != 0 )
{
//循环读出每条记录
//m_lstStudent.AddTail(studentData);
AfxMessageBox(studentsdata.xsbh);
AfxMessageBox(studentsdata.xsxm);
AfxMessageBox(studentsdata.xb);
}
}while(dwRead > 0);
//关闭数据文件
stuFile.Close();
}
//关于CFile类的用法可以看《EVC高级编程及其应用开发》源代码中FileExam那个例子。此外北京那边封装的那个SpFile类也可以拿来用了。这个类很好很强大。
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
然后如果返回的句柄不是INVALID_HANDLE_VALUE时就代表打开或创建成功了。然后利用可以写文件和读文件了
BOOL WriteFile(
HANDLE hFile, //CreateFile反回的句柄
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
BOOL ReadFile(
HANDLE hFile, ////CreateFile反回的句柄
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
其中还有几个很有用的函数比如
BOOL SetEndOfFile( //把文件目前的Pointer挪到文件尾
HANDLE hFile
);
DWORD SetFilePointer( //设置文件目前的Pointer
HANDLE hFile,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod
);
此外还有系统几个函数比如:
BOOL SetFileAttributes( //设置文件属性
LPCTSTR lpFileName,
DWORD dwFileAttributes
);
BOOL GetFileTime( //取得文件时间
HANDLE hFile,
LPFILETIME lpCreationTime,
LPFILETIME lpLastAccessTime,
LPFILETIME lpLastWriteTime
);
BOOL SetFileTime( //设置文件时间
HANDLE hFile,
const FILETIME* lpCreationTime,
const FILETIME* lpLastAccessTime,
const FILETIME* lpLastWriteTime
);
以上是利用系统的API函数来实现读写文件的方法
MFC中有一个封装了以上这些API函数操作的类叫做CFile类。一般对文件操作方法都有。而且更加简单易用。下面举一个小例子
//创建一个结构体记录,定义学生基本信息结构
typedef struct _CStudentData
{
TCHAR xsbh[20]; //学生编号
TCHAR xsxm[20]; //学生姓名
TCHAR xb[20]; //学生性别
}CStudentData;
//定一个该结构体的一个实例
CStudentData studentsdata;
//给这个结构体实例附值
CString m_xsbh = L"01";
CString x_sxm = L"李楠";
CString x_b = L"男";
wcscpy(studentsdata.xsbh,m_xsbh);
wcscpy(studentsdata.xsxm,x_sxm);
wcscpy(studentsdata.xb,x_b);
const LPCTSTR STUDENTFILEPATH = _T("\\Storage Card\\student.dat");
//创建数据库
CFile stuFile;
if (!stuFile.Open(STUDENTFILEPATH,CFile::modeCreate|CFile::modeWrite))
{
AfxMessageBox(_T("创建数据库失败"));
}
stuFile.Close();
//写入文件
stuFile.Open(STUDENTFILEPATH,CFile::modeRead | CFile::modeWrite);
stuFile.SeekToEnd();
stuFile.Write(&studentsdata,sizeof(studentsdata));
stuFile.Close();
//试着读取出来
if (stuFile.Open(STUDENTFILEPATH,CFile::modeRead))
{
do
{
dwRead = stuFile.Read(&studentsdata,sizeof(studentsdata));//每次读出一条记录。
if (dwRead != 0 )
{
//循环读出每条记录
//m_lstStudent.AddTail(studentData);
AfxMessageBox(studentsdata.xsbh);
AfxMessageBox(studentsdata.xsxm);
AfxMessageBox(studentsdata.xb);
}
}while(dwRead > 0);
//关闭数据文件
stuFile.Close();
}
//关于CFile类的用法可以看《EVC高级编程及其应用开发》源代码中FileExam那个例子。此外北京那边封装的那个SpFile类也可以拿来用了。这个类很好很强大。
相关文章推荐
- Linux 中关于文件锁的系统调用
- 关于FATFS文件系统挂载多个磁盘
- 关于ebs文件系统的架构
- 关于如何找到vmx文件(虚拟系统配置文件)的方法
- 关于VFS文件系统中的superblock、inode、d_entry和file数据结构
- 一个关于webservice的Axis问题 Processing file deploy.wsdd Exception: deploy.wsdd (系统找不到指定的文件。)
- linux-文件系统管理10-关于存储介质的那些事儿
- 关于linux 的文件系统卷标(volume label)
- Linux 中关于文件锁的系统调用:flock和fcntl
- 转载:关于 /proc文件系统
- 关于Android系统目录下文件的操作
- 关于CentOS系统中,文件权限第11位上是一个点的解读
- 推荐一篇非常不错的关于Linux系统硬盘、分区及文件系统的基本概念介绍文章
- 关于ext3,ext4,xfs和btrfs文件系统性能对比
- 【转】关于iPhone文件系统NSFileManager讲解
- 一张关于威博文件管理系统3.6的应用图览
- 关于ext2文件系统支持的最大文件大小
- linux中关于文件系统的简要介绍和一般操作
- 关于android系统对AndroidManifest文件的解析机制
- 关于文件系统的总结