文件操作
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 文件写入失败
先考虑磁盘空间不足的情况。