3.取得和设置文件的创建时间、最后访问时间、最后写时间
| BOOL GetFileTime( HANDLE hFile, // 文件句柄 LPFILETIME lpCreationTime, // 创建时间 LPFILETIME lpLastAccessTime, // 最后访问时间 LPFILETIME lpLastWriteTime // 最后写时间 ); BOOL SetFileTime( HANDLE hFile, CONST FILETIME *lpCreationTime, CONST FILETIME *lpLastAccessTime, CONST FILETIME *lpLastWriteTime ); typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME; |
取得三个参数都是FILETIME结构,得到的都是UTC时间,可以通过API函数FileTimeToLocalFileTime()和FileTimeToSystemTime()将他们转换为本地时间和系统时间格式,也可以通过LocalFileTimeToFileTime 和SystemTimeToFileTime()转换回来,通过SetFileTime设置文件的创建时间、最后访问时间、最后写时间。由于使用的时候要先打开文件,而且取得的最后访问时间就是当前时间,没有多大意义,且比较麻烦,下面介绍CFile类中的静态方法。
| static BOOL PASCAL GetStatus( LPCTSTR lpszFileName, CFileStatus& rStatus ); static void SetStatus( LPCTSTR lpszFileName, const CFileStatus& status ); throw( CFileException ); |
返回的是一个CfileStatus对象,这个结构的具体的成员变量包括:
| struct CFileStatus { CTime m_ctime; // 文件创建时间 CTime m_mtime; // 文件最近一次修改时间 CTime m_atime; // 文件最近一次访问时间 LONG m_size; // 文件大小 BYTE m_attribute; // 文件属性 BYTE _m_padding; // 没有实际含义,用来增加一个字节 TCHAR m_szFullName[_MAX_PATH]; //绝对路径 #ifdef _DEBUG //实现Dump虚拟函数,输出文件属性 void Dump(CDumpContext& dc) const; #endif }; |
下面就举一个例子来实现:
| CFileStatus status; char *path = "D:\\VSS"; if(CFile::GetStatus( path, status )) { CString cTime,mTime,aTime; cTime = status.m_ctime.Format("文件建立时间:%Y年%m月%d日 %H时%M分%S秒"); mTime = status.m_mtime.Format("文件最近修改时间:%Y年%m月%d日 %H时%M分%S秒"); aTime = status.m_atime.Format("文件最近访问时间:%Y年%m月%d日 %H时%M分%S秒"); CString str; str = cTime + "\n" + mTime +"\n" + aTime ; MessageBox(str); } |
4.取得和设置文件的属性
| DWORD GetFileAttributes( LPCTSTR lpFileName //文件或文件夹路经 ); BOOL SetFileAttributes( LPCTSTR lpFileName, // 文件名 DWORD dwFileAttributes // 要设置的属性 ); |
取得的文件属性包括:FILE_ATTRIBUTE_ARCHIVE,FILE_ATTRIBUTE_HIDDEN,FILE_ATTRIBUTE_NORMAL,FILE_ATTRIBUTE_OFFLINE,FILE_ATTRIBUTE_READONLY,FILE_ATTRIBUTE_SYSTEM,FILE_ATTRIBUTE_TEMPORARY
不能设置的文件属性包括有:FILE_ATTRIBUTE_COMPRESSED,FILE_ATTRIBUTE_DIRECTORY,FILE_ATTRIBUTE_ENCRYPTED,FILE_ATTRIBUTE_REPARSE_POINT,FILE_ATTRIBUTE_SPARSE_FILE,FILE_ATTRIBUTE_SYSTEM。
CFileStatus中也定义了一组属性:
| enum Attribute { normal, readOnly, hidden, system, volume, directory, archive }; |
可以通过if((status. m_attribute& readOnly) = =FILE_ATTRIBUTE_READONLY)来判断,这里利用另外的API来实现获得文件的详细信息:
| HANDLE FindFirstFile( LPCTSTR lpFileName, //文件或文件夹路经r LPWIN32_FIND_DATA lpFindFileData ); BOOL FindNextFile( HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData ); BOOL FindClose(HANDLE hFindFile ); |
取得的是一个WIN32_FIND_DATA结构;
| typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; //文件属性 FILETIME ftCreationTime; // 文件创建时间 FILETIME ftLastAccessTime; // 文件最后一次访问时间 FILETIME ftLastWriteTime; // 文件最后一次修改时间 DWORD nFileSizeHigh; // 文件长度高32位 DWORD nFileSizeLow; // 文件长度低32位 DWORD dwReserved0; // 系统保留 DWORD dwReserved1; // 系统保留 TCHAR cFileName[ MAX_PATH ]; // 长文件名 TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名 } WIN32_FIND_DATA, *PWIN32_FIND_DATA; |
也可以利用另外一个函数来取得文件的信息:
| BOOL GetFileInformationByHandle( HANDLE hFile, // 文件的句柄 LPBY_HANDLE_FILE_INFORMATION lpFileInformation ); |
函数填充的是BY_HANDLE_FILE_INFORMATION结构体:
| typedef struct _BY_HANDLE_FILE_INFORMATION { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD dwVolumeSerialNumber; // 文件所在的磁盘的序列号 DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD nNumberOfLinks; //链接的数目 DWORD nFileIndexHigh; DWORD nFileIndexLow; } BY_HANDLE_FILE_INFORMATION; |
下面就举一个例子来实现:
| HANDLE handle; WIN32_FIND_DATA find_data; handle = :: FindFirstFile("D:\\VSS",&find_data); FindClose(handle); find_data.dwFileAttributes = find_data.dwFileAttributes|FILE_ATTRIBUTE_READONLY; ::SetFileAttributes("D:\\VSS",find_data.dwFileAttributes); |
在上面的介绍中,除了可以设置文件的属性之外,在操作的过程当中也可以取得文件的其他一些信息,可以根据具体的需要来实现。
