博客日历
2025年06月 | ||||||
一 | 二 | 三 | 四 | 五 | 六 | 七 |
26 | 27 | 28 | 29 | 30 | 31 | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
存档
2025年03月 2024年
03月 04月 05月 2021年
01月 02月 11月 12月 2020年
02月 03月 04月 05月 06月 07月
09月 2018年
09月 2017年
01月 02月 07月 2016年
01月 04月 07月 08月 11月 12月
2015年
01月 02月 03月 05月 09月 10月
11月 2014年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2013年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2012年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2011年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2010年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2009年
03月 04月 05月 06月 07月 08月
09月 10月 11月 12月
用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);
如果我们要从文件句柄获取文件名,可以参考http://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的文件权限
http://haoel.blog.51cto.com/313033/124668
http://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.文件的附加数据流
参看http://www.qingfengju.com/article.asp?id=65
一个NTFS数据流枚举,附加,删除的类CNtfsStream
6.文件的结构化存储
参看http://www.diybl.com/course/3_program/c++/cppxl/20081118/151932.html
上一篇: Windows的性能计数器访问接口
下一篇: 基于浏览器BHO技术网页内容过滤系统
分类:Win32/C++ 查看次数:8250 发布时间:2009/6/6 11:24:40