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

来源:互联网 发布:itunes管理iphone软件 编辑:程序博客网 时间:2024/05/19 17:09

文件操作

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          文件写入失败

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

0 0