c++中,如何获得文件属性(创建时间,修改时间,访问时间)?
3个回答
展开全部
如果是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函数格式化为随意形式的时间字符串格式即可
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函数格式化为随意形式的时间字符串格式即可
更多追问追答
追问
谢谢!能否写出具体的代码啊,要求能够计算出文件的创建和修改的时间差。
追答
间附件,太多了,百度让精简。
展开全部
标准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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2017-08-27
展开全部
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
); //关闭文件
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询