码迷,mamicode.com
首页 > 编程语言 > 详细

用VC++编程全面掌控文件属性

时间:2016-05-14 00:43:49      阅读:523      评论:0      收藏:0      [点我收藏+]

标签:

在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

 

用VC++编程全面掌控文件属性

标签:

原文地址:http://www.cnblogs.com/dgx/p/5491532.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!