VC编程之用VC++全面掌控文件属性
小标 2018-08-28 来源 : 阅读 1676 评论 0

摘要:本文主要向大家介绍了VC编程之用VC++全面掌控文件属性,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之用VC++全面掌控文件属性,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

在VC++的编程中,如何读取或设置文件的属性呢,经过一番研究,这里总结一下。
1.读取文件属性
使用FindFirstFile函数可以读取文件的各种基本属性,其原形是:
HANDLE FindFirstFile( 
LPCTSTR lpFileName,   //这个参数是要读取属性的文件路径
LPWIN32_FIND_DATA lpFindFileData //WIN32_FIND_DATA结构体,用于接收获取到的属性信息。
);
我们可以这样使用它:
WIN32_FIND_DATA _FindFileData;
ZeroMemory(&_FindFileData,sizeof(WIN32_FIND_DATA));
HANDLE hFind=::FindFirstFile(csPath,&_FindFileData);
if (hFind==INVALID_HANDLE_VALUE)
{
 return FALSE;
}
WIN32_FIND_DATA的定义为:
typedef struct _WIN32_FIND_DATA {
 
//dwFileAttributes是文件的基本属性,用每个位标志不同的属性
//例如用(_FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)==FILE_ATTRIBUTE_HIDDEN
//可以判断文件是否为隐藏文件。
DWORD dwFileAttributes; 

//文件创建时间,可以通过CTime(_FindFileData.ftCreationTime),将其转换为CTime;
FILETIME ftCreationTime; 

//文件最后访问时间
FILETIME ftLastAccessTime; 

//文件最后修改时间
FILETIME ftLastWriteTime; 

//文件的大小是用两个DWORD表示的,其间的算术关系为:(nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow
//可以用这样的方式来计算:
//LONGLONG ret=MAXDWORD;
//ret+=1;
//ret*=_FindFileData.nFileSizeHigh;
//ret+=_FindFileData.nFileSizeLow;
//这个+1单独写出来是因为在32位的机器上MAXDWORD+1的中间结果在一个寄存器中无法表示
DWORD nFileSizeHigh;  
DWORD nFileSizeLow; 

//Reserved
DWORD dwReserved0;  
DWORD dwReserved1; 

//文件的名称,如果文件在当前文件夹下,则返回的是相对路径
TCHAR cFileName[MAX_PATH]; 

//文件名称的DOS写法(8.3格式以及~1格式),比如Program Files会被写为Progra~1
TCHAR cAlternateFileName[14];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
有时候,我们想知道文件的完整路径,那么可以使用GetFullPathName函数。
TCHAR szBuffer[MAX_PATH];
LPTSTR lpFilePart=NULL;
::GetFullPathName(_FindFileData.cFileName,MAX_PATH,szBuffer,&lpFilePart);
执行后SzBuffer中即是文件的全名.
要重命名文件,可以执行
::MoveFile(_FindFileData.cFileName, csNewName);
如果我们要从文件句柄获取文件名,可以参考//msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx(Obtaining a File Name From a File Handle)
2.设置文件属性
SetFileAttributes可以设置文件的只读,隐藏,系统等属性。
例如执行:
DWORD dwFileAttributes= GetFileAttributes(lpFileName);
SetFileAttributes(dwFileAttributes | FILE_ATTRIBUTE_SYSTEM);
可以设置文件lpFileName的系统属性。
需要特别注意的是,连续多次调用SetFileAttributes可能会失败,最好将各种属性标志组合好,用SetFileAttributes一次性写入。
SetFileTime可以设置文件的创建时间,修改时间等,原型为:
BOOL SetFileTime(
//文件句柄,可以通过CreateFile得到
HANDLE hFile,

//文件的创建时间
const FILETIME* lpCreationTime,
//最后访问时间
const FILETIME* lpLastAccessTime,
//最后修改时间
const FILETIME* lpLastWriteTime
);
注意时间数据格式之间的转换,比如将CTime转换为FILETIME:
CTime newTime,FILETIME ftCreationTime;

//首先将CTime转换为SYSTEMTIME
SYSTEMTIME st_time;
newTime.GetAsSystemTime(st_time);

//将SYSTEMTIME转换为FILETIME
::SystemTimeToFileTime(&st_time,&ftCreationTime);

//注意本地时间和UTC时间的时差
::LocalFileTimeToFileTime(&ftCreationTime,&ftCreationTime);
 
3.封装的文件属性操作类CFileAttribute
点击下载FileAttribute.rar

该类使用很简单,根据标识符的字面意思就可以了。
 4.文件的权限等属性
请参考文章:以程序的方式操纵NTFS的文件权限
//haoel.blog.51cto.com/313033/124668
//www.google.cn/search?sourceid=navclient&hl=zh-CN&ie=UTF-8&rlz=1T4GFRE_zh-CNCN327CN327&q=%e4%bb%a5%e7%a8%8b%e5%ba%8f%e7%9a%84%e6%96%b9%e5%bc%8f%e6%93%8d%e7%ba%b5NTFS%e7%9a%84%e6%96%87%e4%bb%b6%e6%9d%83%e9%99%90
5.文件的附加数据流
参看//www.qingfengju.com/article.asp?id=65
一个NTFS数据流枚举,附加,删除的类CNtfsStream
6.文件的结构化存储

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved