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

Posted

tags:

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

LUA中如何获取文件创建时间和修改时间
备注:纯LUA语言

参考技术A 用lua file system 这个库,在lua项目主页可以找到,或者去谷歌。
如果你有安装lua for windows 的话,里面就有。
你可以看这个库的例子,里面有教你查看文件的创建日期与修改日期。

下面是例子:

------------------------------------------------------
local tmp = "/tmp"
local sep = "/"
local upper = ".."

require"lfs"
print (lfs._VERSION)

function attrdir (path)
for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then
local f = path..sep..file
print ("\t=> "..f.." <=")
local attr = lfs.attributes (f)
assert (type(attr) == "table")
if attr.mode == "directory" then
attrdir (f)
else
for name, value in pairs(attr) do
print (name, value)
end
end
end
end
end

-- Checking changing directories
local current = assert (lfs.currentdir())
local reldir = string.gsub (current, "^.*%"..sep.."([^"..sep.."])$", "%1")
assert (lfs.chdir (upper), "could not change to upper directory")
assert (lfs.chdir (reldir), "could not change back to current directory")
assert (lfs.currentdir() == current, "error trying to change directories")
assert (lfs.chdir ("this couldn*t be an actual directory") == nil, "could change to a non-existent directory")

-- Changing creating and removing directories
local tmpdir = current..sep.."lfs_tmp_dir"
local tmpfile = tmpdir..sep.."tmp_file"
-- Test for existence of a previous lfs_tmp_dir
-- that may have resulted from an interrupted test execution and remove it
if lfs.chdir (tmpdir) then
assert (lfs.chdir (upper), "could not change to upper directory")
assert (os.remove (tmpfile), "could not remove file from previous test")
assert (lfs.rmdir (tmpdir), "could not remove directory from previous test")
end

-- tries to create a directory
assert (lfs.mkdir (tmpdir), "could not make a new directory")
local attrib, errmsg = lfs.attributes (tmpdir)
if not attrib then
error ("could not get attributes of file `"..tmpdir.."*:\n"..errmsg)
end
local f = io.open(tmpfile, "w")
f:close()

-- Change access time
local testdate = os.time( year = 2007, day = 10, month = 2, hour=0)
assert (lfs.touch (tmpfile, testdate))
local new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == testdate, "could not set access time")
assert (new_att.modification == testdate, "could not set modification time")

-- Change access and modification time
local testdate1 = os.time( year = 2007, day = 10, month = 2, hour=0)
local testdate2 = os.time( year = 2007, day = 11, month = 2, hour=0)

assert (lfs.touch (tmpfile, testdate2, testdate1))
local new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == testdate2, "could not set access time")
assert (new_att.modification == testdate1, "could not set modification time")

local res, err = lfs.symlinkattributes(tmpfile)
if err ~= "symlinkattributes not supported on this platform" then
-- Checking symbolic link information (does not work in Windows)
assert (os.execute ("ln -s "..tmpfile.." _a_link_for_test_"))
assert (lfs.attributes"_a_link_for_test_".mode == "file")
assert (lfs.symlinkattributes"_a_link_for_test_".mode == "link")
assert (os.remove"_a_link_for_test_")
end

if lfs.setmode then
-- Checking text/binary modes (works only in Windows)
local f = io.open(tmpfile, "w")
local result, mode = lfs.setmode(f, "binary")
assert((result and mode == "text") or (not result and mode == "setmode not supported on this platform"))
result, mode = lfs.setmode(f, "text")
assert((result and mode == "binary") or (not result and mode == "setmode not supported on this platform"))
f:close()
end

-- Restore access time to current value
assert (lfs.touch (tmpfile, attrib.access, attrib.modification))
new_att = assert (lfs.attributes (tmpfile))
assert (new_att.access == attrib.access)
assert (new_att.modification == attrib.modification)

-- Remove new file and directory
assert (os.remove (tmpfile), "could not remove new file")
assert (lfs.rmdir (tmpdir), "could not remove new directory")
assert (lfs.mkdir (tmpdir..sep.."lfs_tmp_dir") == nil, "could create a directory inside a non-existent one")

-- Trying to get attributes of a non-existent file
assert (lfs.attributes ("this couldn*t be an actual file") == nil, "could get attributes of a non-existent file")
assert (type(lfs.attributes (upper)) == "table", "couldn*t get attributes of upper directory")

-- Stressing directory iterator
count = 0
for i = 1, 4000 do
for file in lfs.dir (tmp) do
count = count + 1
end
end
print"Ok!"本回答被提问者采纳
参考技术B 借花献佛,使用一楼的第一个函数,就可以达到获取文件创建时间和修改时间的目的。
照搬一楼的代码,以下代码实现遍历当前目录及其子目录中文件并打印其属性:
local tmp = "/tmp"
local sep = "/"
local upper = ".."
require"lfs"
print (lfs._VERSION)
function attrdir (path)
for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then
local f = path..sep..file
print ("\t=> "..f.." <=")
local attr = lfs.attributes (f)
assert (type(attr) == "table")
if attr.mode == "directory" then
attrdir (f)
else
for name, value in pairs(attr) do
print (name, value)
end
end
end
end
end
attrdir(".")

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
); //关闭文件

以上是关于LUA中如何获取文件创建时间和修改时间的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何获取文件创建时间?

如何在 LUA 中运行可执行文件并获取其返回值?

Java如何获取文件的创建时间

如何在 Bash/Debian 中获取文件创建日期/时间?

java循环获取文件夹里文件创建时间 。。

lua中如何获取表里随机的数值?