转载自 http://www.cnblogs.com/jieke/archive/2013/01/11/2855782.html

本文介绍了在Delphi中利用系统函数和Windows API函数调用来获取和修改文件的时间信息的方法。

熟悉Windows 95/98的朋友一定经常会用单击鼠标右键的方法来查看所选定的文件的属性信息。在属性菜单中会列

出该文件的创建时间、修改时间和访问时间。这些信息常常是很有用的,它们的设置一般都是由操作系统(也就

是由Dos/Windows等等)自动完成的,不会让用户轻易修改。

这里,我向大家介绍在Delphi中如何实现文件时间的获取和修改方法。Delphi中提供了很完备的Windows API函数

的调用接口,可以方便的进行高级Windows编程。利用Delphi中的FindFirst函数可以得到一个文件的属性记录,

该记录中的FindData域中就记载了详细的文件时间信息。然而遗憾的是,FindData中的时间信息是不能直接得到

的。因此,有人(编者按:很遗憾不知此人姓名)编写了一个转换函数来完成文件时间格式的转换。下面给出了

具体的实现方法,仅供参考: 
function CovFileDate(Fd:_FileTime):TDateTime; 
{ 转换文件的时间格式 } 
var 
Tct:_SystemTime; 
Temp:_FileTime; 
begin 
FileTimeToLocalFileTime(Fd,Temp); 
FileTimeToSystemTime(Temp,Tct); 
CovFileDate:=SystemTimeToDateTime(Tct); 
end; 
有了上面的函数支持,我们就可以获取一个文件的时间信息了。以下是一个简单的例子: 
procdeure GetFileTime(const Tf:string); 
{ 获取文件时间,Tf表示目标文件路径和名称 } 
const 
Model=yyyy/mm/dd,hh:mm:ss; { 设定时间格式 } 
var 
Tp:TSearchRec; { 申明Tp为一个查找记录 } 
T1,T2,T3:string; 
begin 
FindFirst(Tf,faAnyFile,Tp); { 查找目标文件 } T1:=FormatDateTime(Model, 
CovFileDate(Tp.FindData.ftCreationTime))); 
{ 返回文件的创建时间 } 
T2:=FormatDateTime(Model, 
CovFileDate(Tp.FindData.ftLastWriteTime))); 
{ 返回文件的修改时间 } 
T3:=FormatDateTime(Model,Now)); 
{ 返回文件的当前访问时间 } 
FindClose(Tp); 
end; 
设置文件的时间要复杂一些,这里介绍利用Delphi中的DataTimePicker组件来辅助完成这一复杂的操作。下面的

例子利用了四个DataTimePicker组件来完成文件创建时间和修改时间的设置。注意:文件的访问时间用修改时间

来代替。使用下面的例子时,请在您的Form上添加四个DataTimePicker组件。其中第一和第三个DataTimePicker

组件中的Kind设置为dtkDate,第二个和第四个DataTimePicker组件中的Kind设置为dtkTime. 
procedure SetFileDateTime(const Tf:string); 
{ 设置文件时间,Tf表示目标文件路径和名称 } 
var 
Dt1,Dt2:Integer; 
Fs:TFileStream; 
Fct,Flt:TFileTime; 
begin 
Dt1:=DateTimeToFileDate( 
Trunc(Form1.DateTimePicker1.Date) + Frac(Form1.DateTimePicker2.Time)); 
Dt2:=DateTimeToFileDate( 
Trunc(Form1.DateTimePicker3.Date) + Frac(Form1.DateTimePicker4.Time)); 
{ 转换用户输入在DataTimePicker中的信息 } 
try 
FS := TFileStream.Create(Tf, fmOpenReadWrite); 
try 
if DosDateTimeToFileTime(LongRec(DT1).Hi, LongRec(DT1).Lo, Fct) and 
LocalFileTimeToFileTime(Fct, Fct) and 
DosDateTimeToFileTime(LongRec(DT2).Hi, LongRec(DT2).Lo, Flt) and 
LocalFileTimeToFileTime(Flt, Flt) 
then SetFileTime(FS.Handle, 
@Fct, @Flt, @Flt); 
{ 设置文件时间属性 } 
finally 
FS.Free; 
end; 
except 
MessageDlg(日期修改操作失败!, 
mtError, [mbOk], 0); 
{ 因为目标文件正在被使用等原因而导致失败 } 
end; 
end; 
以上简单介绍了文件时间属性的修改方法,请注意:修改文件时间的范围是从公元1792年9月19日开始的,上限可

以达到公元2999年或更高。另外,请不要将此技术用于破坏他人文件等非正当途径.

API版本:

function GetFileTime(sFileName:string;TimeType:Integer):TDateTime; 
var 
ffd:TWin32FindData; 
dft:DWord; 
lft,Time:TFileTime; 
H:THandle; 
begin 
H:=Windows.FindFirstFile(PChar(sFileName),ffd); 
//找到文件sFileName并填充其TWin32FindData类 
if(H<>INVALID_HANDLE_VALUE)then 
//文件找到,根据TimeType返回相应时间信息 
begin 
case TimeType of 
0:Time:=ffd.ftCreationTime; 
1:Time:=ffd.ftLastWriteTime; 
2:Time:=ffd.ftLastAccessTime; 
end; 
Windows.FindClose(H);

//由于只查找一个文件,所以关掉句柄H 
FileTimeToLocalFileTime(Time,lft); 
//转换FILETIME格式成为localFILETIME格式 
FileTimeToDosDateTime(time,LongRec(dft).Hi,LongRec(dft).Lo); 
//转换FILETIME格式成为DOStime格式 
Result:=FileDateToDateTime(dft); 
//最后,转换DOStime格式成为Delphi的TdateTime格式 
end 
else 
//没找到文件返回0 
result:=0; 
end;

在Delphi中获取和修改文件的时间的更多相关文章

  1. (转载)delphi中获取汉字的拼音首字母

    delphi中获取汉字的拼音首字母1.py: array[216..247] of string = ({216}'CJWGNSPGCGNESYPB' + 'TYYZDXYKYGTDJNMJ' + ' ...

  2. C#获取并修改文件扩展名的方法

    本文实例讲述了C#获取并修改文件扩展名的方法.分享给大家供大家参考.具体分析如下: 这里使用C#编程的方法改变文件扩展名的文件,必须使用Path类. Path类用来解析文件系统路径的各个部分.静态方法 ...

  3. touch - 修改文件的时间戳记.

    总览 touch [-acm][-r ref_file(参照文件)|-t time(时间值)] file(文件名)... 被废弃的版本: touch [-acm][ugly_time] file(文件 ...

  4. Qt下如何修改文件的时间(全平台修改)

    提供一个全平台修改文件的时间的方法,希望大家喜欢 /* UTIME.C: This program uses _utime to set the * file-modification time to ...

  5. 在Delphi中使用系统对应文件类型的图标

    在应用程序的编写中,组合框(ComboBox).列表框(ListBox).等常见的部件,通常不仅要用于显示文字,而且还要显示其与文字相关的图标.在一般的Windows应用程序中,这些图标的显示都要随列 ...

  6. Delphi中获取Unix时间戳及注意事项(c语言中time()是按格林威治时间计算的,比北京时间多了8小时)

    uses DateUtils;DateTimeToUnix(Now) 可以转换到unix时间,但是注意的是,它得到的时间比c语言中time()得到的时间大了8*60*60这是因为Now是当前时区的时间 ...

  7. fcntl获取和修改文件打开状态标志

    [root@bogon code]# cat b.c #include<stdio.h> #include<error.h> #include<unistd.h> ...

  8. linux 修改文件的时间属性

    二.修改文件时间 创建文件我们可以通过touch来创建.同样,我们也可以使用touch来修改文件时间.touch的相关参数如下: -a : 仅修改access time. -c : 仅修改时间,而不建 ...

  9. 从URI中获取实际的文件path

    如题,经常用在onActivityResult方法中解析图片等各种地址,因为Android 4.4之后google更改了对应的方法. /** * Get a file path from a Uri. ...

随机推荐

  1. day6心得

    面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思 ...

  2. ulimit open files linux打开文件数设置验证

    #include <stdio.h> #include <sys/types.h> #include <fcntl.h> #include <stdlib.h ...

  3. wince驱动开发入门

    因为课题前期调研没做好,用的CPU板卡和数据采集卡来自两个部门.加上买的是裸板,自己定制的OS,技术支持不爱搭理.所以给的AI板卡的驱动一直装不上,自己在郁闷中寻找答案,就扎进了wince驱动的知识库 ...

  4. linux下编译wpa_supplicant&nbsp;…

    linux下编译wpa_supplicant 收藏 前一段时间只在vs2005下编译成功过.经过近一段时间的琢磨,今天终于在linux下成功编译了wpa_supplicant. 挺简单的事情折腾了这么 ...

  5. C# 读取文件中的sql语句 创建数据库以及表结构

    大概思路是: 读取文件 根据文件中行内容为GO 作为分割  一条条放到list中 然后在程序中逐条执行sql语句; 值得一提的是 创建数据库的语句是不允许放到程序事务中执行的 所以目前我是分了两个文本 ...

  6. 【HDU4960】Another OCD Patient

    题意 给出一个长度为n的整数序列.可以将一段连续的序列进行合并.合并的长度不同代价不同.问付出最少多少代价可以将这个序列变成一个对称的序列.n<=5000 分析 一看题感觉是个dp很好写啊.f[ ...

  7. linux 压力测试工具 webbench

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装: 1. wget htt ...

  8. springBoot集成 quartz动态定时任务

    项目中需要用到定时任务,考虑了下java方面定时任务无非就三种: 用Java自带的timer类.稍微看了一下,可以实现大部分的指定频率的任务的调度(timer.schedule()),也可以实现关闭和 ...

  9. PHPMailer fe v4.11 For Thinkphp 3.2

    PHPMailer fe v4.11 For Thinkphp 3.2,你值得拥有! 今晚用TP3.2开发一个东西的时候需要邮件发送功能,理所当然的想到了PHPMailer.于是有了此文!------ ...

  10. 第一章Python简介

    1.Python shell(Python命令解释器) 如下所示 2.Python的交互模式 如下 3.代码编辑器窗口 在上面的那些指令称为源代码. 4.在python中,缩进是有语法意义的. 在某行 ...