小标
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
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号