MFC 文件基本操作的异常情况

文件操作

1          文件常见属性

1.1         只读属性

1.2         系统文件属性

1.3         隐藏属性

通过GetFileAttributes来获取

FILE_ATTRIBUTE_READONLY 只读属性

FILE_ATTRIBUTE_HIDDEN    隐藏属性

FILE_ATTRIBUTE_SYSTEM    系统文件属性

去掉只读属性方法

DWORD dwAttri = GetFileAttributes(_T("filepath"));

   if (dwAttri & FILE_ATTRIBUTE_READONLY)

   {

        //有只读属性

        dwAttri &= ~FILE_ATTRIBUTE_READONLY;

        //去掉只读属性

        BOOL bRet = SetFileAttributes(_T("filepath"),dwAttri);

        //设置失败

        if (!bRet)

        {

            DWORD dwErr = GetLastError();

            if (ERROR_ACCESS_DENIED == dwErr)

            {

                //没有权限

            }

            else

            {

                //其他情况处理

            }

        }

}

 

2          文件大小

2.1         物理大小

即实际文件的字节数,读取文件内容时需要用到

使用GetFileSize获取文件的实际字节大小

2.2         占用空间

文件所在磁盘的占用空间大小,跟磁盘的簇大小有关,是簇的最小整数倍。

文件复制时需要考虑

由于磁盘空间不足写入失败的时候判别方法跟占用空间相关。

磁盘簇大小的计算方法:

每簇扇区数 * 每扇区的字节数

BOOL WINAPI GetDiskFreeSpace(

 _In_   LPCTSTR lpRootPathName,

  _Out_  LPDWORDlpSectorsPerCluster,

 _Out_  LPDWORD lpBytesPerSector,

 _Out_  LPDWORD lpNumberOfFreeClusters,

 _Out_  LPDWORD lpTotalNumberOfClusters

);

 

DWORD dwSectorsPerCluster = 0;

    DWORDdwBytesPerSector = 0;

    DWORDdwNumberOfFreeClusters = 0;

    DWORDdwTotalNumberOfClusters = 0;

 

GetDiskFreeSpace(

            szVolumePathName,            //磁盘根路径

            &dwSectorsPerCluster,        //每簇的扇区数

            &dwBytesPerSector,            //每扇区的字节数

            &dwNumberOfFreeClusters,    //空余簇的数量

            &dwTotalNumberOfClusters    //全部簇的数量

            )

 

//簇大小

DWORD dwClusterSize = dwSectorsPerCluster *dwBytesPerSector;

 

簇数 = 文件字节数 / 簇大小结果向上取整

占用空间 = 簇数 * 簇大小

UINT64 dwFileSpacesize =

static_cast<UINT64>(ceil(uFileSize/ static_cast<double>(dwClusterSize)) * dwClusterSize);

 

也可通过GetFileInformationByHandleEx 这个API来获取,不过这个API支持的最低系统版本要求是visita

 

3          文件打开失败

1.      文件是只读属性,在文件打开的时候使用了“写”属性

使用C++标准库 fstream open文件时,加入std::ios::out属性,会引起打开失败

使用MFC 文件操作类CFile Open文件时,CFile::modeReadWrite或CFile::modeWrite

处理办法:

如果只需要读取,去掉“写”属性,保留“读”属性

对应fstream 去掉 out 标示

CFile 改为CFile::modeRead

如需对同一个文件读写操作,先去掉只读属性,参考前面的方法。

2.      没有权限进行打开。

a.用户权限不足。

b.文件正在被独占式访问。

处理办法:

异常处理,记录日志

 

4          文件写入失败

先考虑磁盘空间不足的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值