|
|
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); | 在上面的介绍中,除了可以设置文件的属性之外,在操作的过程当中也可以取得文件的其他一些信息,可以根据具体的需要来实现。
(责任编辑:luwei) |
|
|