c++中,如何获得文件属性(创建时间,修改时间,访问时间)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中,如何获得文件属性(创建时间,修改时间,访问时间)?相关的知识,希望对你有一定的参考价值。

如果是windows平台,使用如下API:

HANDLE WINAPI FindFirstFile(
__in LPCTSTR lpFileName, //文件路径
__out LPWIN32_FIND_DATA lpFindFileData //文件属性信息
);
该函数可以获取文件制定文件包括时间在内的属性信息。这些信息包含在第二个参数执行的结构中:
typedef struct _WIN32_FIND_DATA
DWORD dwFileAttributes;
FILETIME ftCreationTime; //文件创建时间
FILETIME ftLastAccessTime; //文件访问时间
FILETIME ftLastWriteTime; //最近一次修改时间
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[MAX_PATH];
TCHAR cAlternateFileName[14];
WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

其中时间FILETIME结构体如下:
typedef struct _FILETIME
DWORD dwLowDateTime;
DWORD dwHighDateTime;
FILETIME, *PFILETIME;
MSDN不推荐自己加减获取系统格式的时间,而是推荐使用
BOOL WINAPI FileTimeToSystemTime(
__in const FILETIME *lpFileTime, //上面获取的时间
__out LPSYSTEMTIME lpSystemTime //系统时间
);

这里获取的是系统时间:
typedef struct _SYSTEMTIME
WORD wYear; //年
WORD wMonth; //月
WORD wDayOfWeek; //周几
WORD wDay; //日
WORD wHour; //时
WORD wMinute; //分
WORD wSecond; //秒
WORD wMilliseconds; //毫秒
SYSTEMTIME, *PSYSTEMTIME;

至此,时间成功获取
实例代码:
BOOL FileAttributes( LPCTSTR lpszFilePath/*文件路径*/ )

WIN32_FIND_DATA FindFileData = 0 ;

HANDLE hFile = ::FindFirstFile(lpszFilePath, &FindFileData);

if( INVALID_HANDLE_VALUE == hFile )

//handling error
return FALSE;

SYSTEMTIME CreateTime = 0 ; //创建时间
SYSTEMTIME AccessTime = 0 ; //最近访问时间
SYSTEMTIME WriteTime = 0 ; //最近修改时间
if( !::FileTimeToSystemTime( FindFileData.ftCreationTime , &CreateTime) )

//handling error
return FALSE;

if( !::FileTimeToSystemTime( FindFileData.ftLastAccessTime , &AccessTime) )

//handling error
return FALSE;

if( !::FileTimeToSystemTime( FindFileData.ftLastWriteTime, &WriteTime))

//handling error
return FALSE;

//OK 获取时间了,可以使用时间了

::CloseHandle( hFile );

return TRUE;

如果用MFC实现就简单了点:
直接用
static void PASCAL SetStatus(
LPCTSTR lpszFileName,
const CFileStatus& status,
CAtlTransactionManager* pTM = NULL
);
这个静态成员就好了
struct CFileStatus

CTime m_ctime; // creation date/time of file 创建时间
CTime m_mtime; // last modification date/time of file 最近修改时间
CTime m_atime; // last access date/time of file 最近访问时间
ULONGLONG m_size; // logical size of file in bytes
DWORD m_attribute; // logical OR of CFile::Attribute enum values
TCHAR m_szFullName[_MAX_PATH]; // absolute path name
;

示例:
TCHAR* pFileName = _T("ReadOnly_File.dat");
CFileStatus status;
CFile::GetStatus(pFileName, status);
//status中就有时间
//直接用CTime的Format函数格式化为随意形式的时间字符串格式即可追问

谢谢!能否写出具体的代码啊,要求能够计算出文件的创建和修改的时间差。

追答

间附件,太多了,百度让精简。

追问

唉,还是编译不了啊,会报错

追答

那里面是函数,你visual studio哪个版本的。我发给你一个能运行的

追问

我的是vs10版的

追答

我去,百度把我那天给你发的截屏还有vs2010压缩包给删了。。一直没看,刚发现。

追问

是的,能否做个win32控制台那种模式的cpp代码

追答

还满意吗?哥哥

追问

不错不错!非常感谢!“自动监控CPU、内存、GPU使用率”这个怎么做呢

追答

GPU在Win DDK里,微软帮助里:(该函数第二个参数中有)

https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff540675.aspx

由于本人不是做硬件驱动的,所以没获取GPU使用率,如果想要,等我闲下来给你做,现在只做了前两个,你要的console版本。


追问

这个地方报错了

追答

程序没问题,

stdafx.cpp右键——属性,预编译头选“创建”,其它cpp选“使用”。

给你exe好了

 

参考技术A

标准C++没有这个功能,得通过操作系统API来实现

Windows下是这样的

WIN32_FILE_ATTRIBUTE_DATA    attr;     //文件属性结构体
TCHAR file[20] = "C:\\\\Windows\\\\123.txt";     //文件名
GetFileAttributesEx(file,GetFileExInfoStandard,&attr);        //获取文件属性
FILETIME createTime = attr.ftCreationTime;                    //获取文件时间
FILETIME accessTime = attr.ftLastAccessTime;             
FILETIME modifyTime = attr.ftLastWriteTime;
SYSTEMTIME time;                                                     //系统时间结构体
FileTimeToSystemTime(&createTime,&time);             //将文件事件转换为系统时间

创建时间:    年 -----  time.wYear         月-----  time.wMonth   日------ time.wDay

时------  time.wHour        分-----  time.wMinute   秒-----  time.wSecond

参考技术B HANDLE CreateFile(
 LPCTSTR lpFileName, 
 DWORD dwDesiredAccess, 
 DWORD dwShareMode, 
 LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
 DWORD dwCreationDisposition, 
 DWORD dwFlagsAndAttributes, 
 HANDLE hTemplateFile
);  //打开文件
BOOL GetFileTime( 
 HANDLE hFile, 
 LPFILETIME lpCreationTime, 
 LPFILETIME lpLastAccessTime, 
 LPFILETIME lpLastWriteTime 
); //获取文件时间
BOOL FileTimeToSystemTime( 
 const FILETIME* lpFileTime, 
 LPSYSTEMTIME lpSystemTime 
); //转换为系统时间
BOOL CloseHandle( 
 HANDLE hObject
); //关闭文件

以上是关于c++中,如何获得文件属性(创建时间,修改时间,访问时间)?的主要内容,如果未能解决你的问题,请参考以下文章

java 如何获得一个文件夹的创建时间 具体点

node实现文件属性批量修改(时间属性)

如何修改每一个文件的时间?

LUA中如何获取文件创建时间和修改时间

描述符简介

Linux中如何查看文件的最初创建时间