• 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_(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();

     

  • 相关阅读:
    LeetCode OJ-- LRU Cache ***@
    LeetCode OJ-- Maximal Rectangle ***@
    LeetCode OJ-- Maximum Subarray @
    LeetCode OJ--Merge Intervals @
    导出你的GAC Assembly中的DLLS -- 金大昊(jindahao)
    Unity3d学习日记(六)
    如何不冲会员高速下载百度网盘上的资源
    3dContactPointAnnotationTool开发日志(三四)
    3dContactPointAnnotationTool开发日志(三三)
    3dContactPointAnnotationTool开发日志(三二)
  • 原文地址:https://www.cnblogs.com/cteng-common/p/file_operation.html
Copyright © 2020-2023  润新知