Windows API函数
1.创建或打开文件
HANDLE hFile = ::CreateFile(_T("E:\Program\测试文件夹\myfile.txt"), //创建或打开的文件
GENERIC_READ| GENERIC_WRITE, //文件存取方式(GENERIC_WRITE)
FILE_SHARE_READ,//共享属性(FILE_SHARE_WRITE/DELETE)
NULL,//安全属性
OPEN_ALWAYS,//文件存在或不存在时采取的操作
FILE_ATTRIBUTE_NORMAL, //新文件属性
NULL);//文件模板的句柄
//文件存在或不存在时采取的操作有:(CREATE_ALWAYS OPEN_ALWAYS (总能成功)// CREATE_NEW OPEN_EXISTING TRUNCATE_EXISTING(可能失败))
//文件属性有:FILE_ATTRIBUTE_(归档,隐藏,只读,系统,临时)
//可以加上对文件操作方式:FILE_FLAG_(关闭后立即清除,异步读写文件,不使用缓存直接写硬盘)
if (hFile == INVALID_HANDLE_VALUE)
{
::MessageBox(NULL, _T("不能够打开文件!"), _T("错误"), IDYES);
}
2.读写文件+移动文件指针
CHAR wbuffer[256] = { 'a','b','c','d','e','f','g','g','h','i','j',' ', ' ',' ' ,' ',' ','0' };
DWORD wByte;
::WriteFile(hFile, wbuffer, 256, &wByte, NULL);
::SetFilePointer(hFile, //文件句柄
0, //移动距离 (移动TXT时候只是在同一行,不会换行)
NULL, //移动距离的高32位
FILE_BEGIN); //移动的模式(FILE_(BEGINCURRENTEND)何处开始移动)
//返回值是新的文件指针位置或-1(失败)
CHAR rbuffer[256] = {};
DWORD rByte;
::ReadFile(hFile, &rbuffer, 256, &rByte, NULL);
::SetEndOfFile(hFile);//移动文件结束标志EOF至文件指针位置
//SetFilePointer+SetEndOfFile可以用来截断或者扩展文件
//读写都是从文件指针位置开始的
3.锁定+解锁文件(阻止其他程序读写)
::LockFile(hFile, //主要防止其他进程读写
0, //起始位置
0,
1024, //区域大小
0);
::UnlockFile(hFile,0,0,1024,0);
4.常用文件操作
DWORD fileType = ::GetFileType(hFile);//FILE_TYPE_CHAR/DISK/PIPE/UNKNOWN
DWORD fileSizeHigh; //文件长度的高字
DWORD fileSize = ::GetFileSize(hFile, &fileSizeHigh);//文件长度低字
DWORD fileAttrubutes = ::GetFileAttributes(_T("E:\Program\测试文件夹\myfile.txt"));
::CopyFile(_T("E:\Program\测试文件夹\myfile.txt"), //源文件
_T("E:\Program\测试文件夹\Copyfile.txt"), //目标文件
FALSE); //若目标文件存在是否按出错处理
::DeleteFile(_T("E:\Program\测试文件夹\Copyfile.txt"));//只能删除存在且非只读文件
::MoveFile(_T("E:\Program\测试文件夹\myfile.txt"), _T("E:\Program\测试文件夹\测试目录\myfile.txt"));//(失败)
::MoveFileEx(_T("E:\Program\测试文件夹\测试目录\myfile.txt"),
_T("E:\Program\测试文件夹\myfile.txt"),
MOVEFILE_REPLACE_EXISTING);//如果文件已经存在就替换
//MOVEFILE_DELAY_UNTIL_REBOOT 直到重启再移动(若想下次启动就删除文件则第二个参数设置为NULL)
//MOVEFILE_WRITE_THROUGH 直到原文件从磁盘删除再返回
::CloseHandle(hFile);//使用完毕就释放句柄
5.MFC对文件的操作(读写+移动指针)
//MFC CFile类
CFile file,file1;
file.Open(_T("E:\Program\测试文件夹\CFilemyfile.txt"), CFile::modeReadWrite | CFile::modeCreate|CFile::shareDenyWrite);
//默认是独占方式并且存在的文件长度会被截为0 (可以设置共享模式shareDenyNone等)
CFileException e;
file1.Open(_T("E:\Program\测试文件夹\myfile.txt"), CFile::modeRead | CFile::modeCreate|CFile::modeNoTruncate,&e);
//CFile::modeNoTruncate长度不会被截为0
BYTE buffer1[4096] = { "abcdefghijklmnopqrstuvwxyz" };
file.Write(buffer1, 4096); //写
file.Seek(0, FILE_BEGIN); //移动文件指针
BYTE buffer[4096];
UINT nBytesRead = file.Read(buffer, sizeof(buffer)); //读,返回未读取字节数
file.Close();