标签:
在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
标签:
原文地址:http://www.cnblogs.com/dgx/p/5491532.html