C++对文件的操作


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_(BEGIN\CURRENT\END)何处开始移动) //返回值是新的文件指针位置或-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();

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM