zoukankan      html  css  js  c++  java
  • 转:MFC文件操作

    讲到文件操作我们会联想到自己手动操作文件会涉及到哪些内容.很容易想到的是查看文件(文件夹)是否存在,创建,复制,删除,剪切文件(文件夹).另外就是设置文件的属性.

    那MFC中一些操作文件的类也差不多是会涉及到你如上操作.

    查看文件

    查看文件你可能凭直观感觉想到用find , search这样的函数.猜的大概不错.MFC中有个类CFileFind,它有个函数FindFile可以来判断文件是否存在.

    CFileFind用法

    CFileFind fileFind;

    CString strFileName;

    strFileName = _T("D:\test.txt");

    if(fileFind.FindFile(strFileName) );

    除了查看文件是否存在CFileFind类中还有许多其他函数可以得到文件的详细信息.比如

    IsReadOnly查看是否只读

    IsHidden是否隐藏

    GetLastAccessTime 查看上次文件访问时间

    GetLength查看文件大小(不过要注意的是调用了FindFile函数后还得再来个fileFind.FindNextFile(),然后再调用fileFind.GetLength()才不会出错)

    另外还有个结构体叫CFileStatus,也可以实现类似的一些功能.

    CFileStatus用法

    struct CFileStatus{

    CTime m_ctime; // creation date/time of file

    CTime m_mtime; // last modification date/time of file

    CTime m_atime; // last access date/time of file

    ULONGLONG m_size; // logical size of file in bytes

    BYTE m_attribute; // logical OR of CFile::Attribute enum values

    BYTE _m_padding; // pad the structure to a WORD

    TCHAR m_szFullName[_MAX_PATH]; // absolute path name

    }

    CFileStatu在CFile的函数GetStatus中会用到,该函数有两个版本

    BOOL GetStatus(
       CFileStatus& rStatus 
    ) const;
    static BOOL GetStatus(
       LPCTSTR lpszFileName,
       CFileStatus& rStatus 
    );

    其中一个是CFile的普通成员函数,一个是static类型的函数.也可以用该函数判断文件是否存在

    CFile file;

    CFileStatus fileStatus;

    CString strFileName;

    strFileName = _T("D:\test.txt");

    if(file.GetStatus(fileStatus))   //或者用CFile:GetStatus(strFileName, fileStatus)

    //存在

    else

    //不存在

    查看,创建目录

    查看目录是否存在很简单

    CString strDirPath = _T("D:\Temp");

    BOOL bExistDir = ::PathFileExists(strDirPath);

    创建目录

    CString strDirName = _T("D:\Temp\Dir");

    ::CreateDirectory(strDirName,NULL); //要保证Temp是存在的.

    创建文件

    CFile file;

    CFileException exp;

    CString strFileName = _T("D:\temp\arwen.txt");

    //创建文件,如果已经存在文件则会覆盖之前的内容

    BOOL bCreateFile = file.Open(strFileName,CFile::modeCreate,&exp);

    如果创建失败你想知道详细信息的话可以通过exp.m_cause去获取, 可能的错误信息是

    enum {none,  genericException,

    fileNotFound,  badPath,

    tooManyOpenFiles,   accessDenied,

    invalidFile,      removeCurrentDir,

    directoryFull,    badSeek,

    hardIO,  sharingViolation,

    lockViolation,    diskFull,  endOfFile

    }

    写文件

    假如要往文件中写入些内容

    CFile file;

    CString strFileName = _T("D:\temp\arwen.txt");

    CString strInfo = _T("hello,world ");

    int nSize = strInfo.GetLength();

    if(file.Open(strFileName,CFile::modeReadWrite,&exp))

    {

    file.Write(strInfo.GetBuffer(0),nSize);

    file.Flush();

    file.Close();

    }

    不过CFile用起来还是不方便,有个继承自它的类CStdioFile,用起来就比较方便

    CStdioFile file;

    file.WriteString(strInfo);

    读文件

    CStdioFile file;

    file.Open(strFileName,CFile::modeRead);

    CString strText;

    CString strTemp;

    while(file.ReadString(strTemp))

    {

      strText += strTemp;

    }

    file.Close();

    文件属性设置

    假如你读或写文件时不让其他人操作该文件(有点像数据库中的上锁),咋整呢?

    file.Open( strFileName, CFile::modeWrite | CFile:shareDenyRead)

    CFile:shareDenyRead 就表示你操作时别人也不能读文件.

    如果是可让别人读但不能写就是CFile::shareDenyWrite

    另外我们经常碰到一些文件时只读的,或者是隐藏的.怎么在代码中设置呢

    SetFileAttributes(strFileName, FILE_ATTRIBUTE_READONLY);  //设置文件为只读

                                                 FILE_ATTRIBUTE_HIDDEN就是表示隐藏

    假如你要取消这些属性就这样

    SetFileAttributes(strFileName, FILE_ATTRIBUTE_NORMAL);

    设置属性还有另外一个方法

    CFileStatus status;

    CFile::GetStatus(strFileName, status);

    status.m_attribute |= CFile::readOnly;

    CFile::SetStatus(strFileName, status);

  • 相关阅读:
    matlab-vrep程序控制方法
    .ipyb文件怎么转成 .py文件
    python技巧
    gradle初步认识
    StringUtils
    Elasticsearch、Logstash和Kibana ELK
    redisTemplate、jedis、redission的对比
    唯一ID
    spring相关组件简介
    新电脑环境配置
  • 原文地址:https://www.cnblogs.com/yfz0/p/5257934.html
Copyright © 2011-2022 走看看