正 文

解读VC++编程中的文件操作API和CFile类


www.7dspace.com  更新日期:2006-3-7 7:00:05  七度空间


  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);

  在上面的介绍中,除了可以设置文件的属性之外,在操作的过程当中也可以取得文件的其他一些信息,可以根据具体的需要来实现。

4页,页码:[1] [2] [3] [4] 

上一篇:封装的变化之不断变化的需求
下一篇:Alexa排名对新闻类网站的参考作用
解读VC++编程中的文件操作API和CFile类 作者:RisingMine 来源:天极网
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐