请问如何获取文件的创建日期

giboer 2004-06-29 10:37:13
查到两个函数: FileAge 和 FileGetDate, 可是它们返回的都是文件的修改日期?
...全文
604 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
giboer 2004-06-30
  • 打赏
  • 举报
回复
整理结果:获取文件相关时间的几种方法
1. 使用FileAge() 获取文件创建时间(但好像返回的结果和FileGetDate一样)
用法:
int sTime = FileAge(AnsiString FileName);
Edit1->Text = FileDateToDateTime(sTime);
2.使用FileGetDate() 获取文件编修日期
用法:
int hFile;
hFile = FileOpen("c:\\devcon.exe",fmOpenRead);
int sTime = FileGetDate(hFile);
Edit1->Text = FileDateToDateTime(sTime);
FileClose(hFile);
3. 使用FindFirst()的TSearchRec结构
用法:
TSearchRec sr;
int iAttributes = 0;
SYSTEMTIME sTime;
if (FindFirst("c:\\pppp.vsd", iAttributes, sr) == 0)
{
FileTimeToSystemTime(&(sr.FindData.ftCreationTime),&sTime); //这里是获取创建时间,其他类似
FindClose(sr);
}
Edit1->Text = SystemTimeToDateTime(lpSystemTime);
附:
struct TSearchRec
{
int Time; //--本人测试结果为编修时间,即与FileAge,FileGetDate获取的数值一样。
int Size;
int Attr;
AnsiString Name;
int ExcludeAttr;
int FindHandle;
_WIN32_FIND_DATAA FindData;
void * FindHandle;
char[4097] FindData;
char[257] Pattern;
} ;

---------------------------------------------------------------
4.使用API GetFileTime
用法:其中第二个参数之指示返回三个时间中的哪一个,但注意用GetFileTime返回的最后访
问时间始终是当前时间,因此没有什么意义,好像可以用FindFirst来代替,不过我没有找相
资料。
BOOL MyGetFileTime(AnsiString FileName, int type,SYSTEMTIME &stime)
{
HANDLE hFile = CreateFile (FileName.c_str(), GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
FILETIME lpCreationTime; // 创建时间
FILETIME lpLastAccessTime; // 最近访问时间
FILETIME lpLastWriteTime; // 最近修改时间

if (GetFileTime(hFile, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime))
{
FILETIME ftime;
switch(type)
{
case 0: FileTimeToLocalFileTime(&lpCreationTime, &ftime); break;
case 1: FileTimeToLocalFileTime(&lpLastAccessTime, &ftime); break;
case 2: FileTimeToLocalFileTime(&lpLastWriteTime, &ftime); break;
default:
CloseHandle(hFile); // 关闭文件
return False;
}
FileTimeToSystemTime(&ftime, &stime); // 转换成系统时间格式
CloseHandle(hFile); // 关闭文件
return True;
}
else
{
CloseHandle(hFile); // 关闭文件
return False;
}
}

5.
雪中送炭--BCB函数库1.1
http://zydlm.wxhc.com.cn/down_view.asp?id=119

这里边有这几个函数的详细用法和实例。
就是FindFirst,FileTime的转换什么的。
giboer 2004-06-30
  • 打赏
  • 举报
回复
衷心的感谢各位,感谢csdn, 这张帖子让我学到了许多。结帖。
giboer 2004-06-30
  • 打赏
  • 举报
回复
另一种方法: 可以解决问题, 不过因为使用GetFileTime,所以最后访问时间始终是当前时间。

BOOL MyGetFileTime(AnsiString FileName, int type,SYSTEMTIME &stime)
{
HANDLE hFile = CreateFile (FileName.c_str(), GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
FILETIME lpCreationTime; // 创建时间
FILETIME lpLastAccessTime; // 最近访问时间
FILETIME lpLastWriteTime; // 最近修改时间

if (GetFileTime(hFile, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime))
{
FILETIME ftime;
switch(type)
{
case 0: FileTimeToLocalFileTime(&lpCreationTime, &ftime); break;
case 1: FileTimeToLocalFileTime(&lpLastAccessTime, &ftime); break;
case 2: FileTimeToLocalFileTime(&lpLastWriteTime, &ftime); break;
default:
CloseHandle(hFile); // 关闭文件
return False;
}
FileTimeToSystemTime(&ftime, &stime); // 转换成系统时间格式
CloseHandle(hFile); // 关闭文件
return True;
}
else
{
CloseHandle(hFile); // 关闭文件
return False;
}
}

调用:
SYSTEMTIME sTime;
if(MyGetFileTime(Edit1->Text,0,sTime))
Edit2->Text = SystemTimeToDateTime(sTime);
crysword 2004-06-30
  • 打赏
  • 举报
回复
所以我这里没有使用lpsystemtime类型而使用了systemtime类型。
Maconel 2004-06-30
  • 打赏
  • 举报
回复
雪中送炭--BCB函数库1.1
http://zydlm.wxhc.com.cn/down_view.asp?id=119

这里边有这几个函数的详细用法和实例。
就是FindFirst,FileTime的转换什么的。
giboer 2004-06-30
  • 打赏
  • 举报
回复
TSearchRec sr;
int iAttributes = 0;
LPSYSTEMTIME lpSystemTime;
if (FindFirst("c:\\devcon.exe", iAttributes, sr) == 0)
{
FILETIME t1= sr.FindData.ftCreationTime;
FileTimeToSystemTime(&t1,lpSystemTime); //语句1
Edit1->Text = SystemTimeToDateTime(*lpSystemTime);
FindClose(sr);
}
这样转换后会报非法访问错,好像是因为语句1访问了sr结构?
crysword 2004-06-30
  • 打赏
  • 举报
回复
大概是这样转换的。

TSearchRec sr;
int iAttributes = 0;
SYSTEMTIME lpSystemTime;
if (FindFirst("c:\\pppp.vsd", iAttributes, sr) == 0)
{
FileTimeToSystemTime(&sr.FindData.ftCreationTime,&lpSystemTime);
FindClose(sr);
}
Edit1->Text = SystemTimeToDateTime(lpSystemTime);
giboer 2004-06-30
  • 打赏
  • 举报
回复
TSearchRec sr;
int iAttributes = 0;
LPSYSTEMTIME lpSystemTime;
if (FindFirst("c:\\test.exe", iAttributes, sr) == 0)
{
FileTimeToSystemTime(sr.FindData.ftCreationTime,lpSystemTime);
FindClose(sr);
}

对类型转换不大熟悉,在FileTimeToSystemTime中要求参数为CONST FILETIME 类型 ,而能得到的是FILETIME类型, 怎样转换呢?
giboer 2004-06-29
  • 打赏
  • 举报
回复
谢3996996,试试先。

jone7319:我用FileAge不成功啊。
方法如下: sTimeString = FileDateToDateTime(FileAge(FileName)).TimeString();返回的是修改日期。你成功了不?
jone7319 2004-06-29
  • 打赏
  • 举报
回复
用FileAge()
3996906 2004-06-29
  • 打赏
  • 举报
回复
用FileFirst()找出一个下面结构体的信息来,文件相关的信息要什么有什么
struct TSearchRec

{
int Time;
int Size;
int Attr;
AnsiString Name;
int ExcludeAttr;
int FindHandle;
_WIN32_FIND_DATAA FindData;
void * FindHandle;
char[4097] FindData;
char[257] Pattern;
} ;
crysword 2004-06-29
  • 打赏
  • 举报
回复
FindFirst("文件路径",0,sr)
得到的sr就是以后再说说的结构体
giboer 2004-06-29
  • 打赏
  • 举报
回复
其实(以后再说)的方法,我不太明白的,能不能详细指教一下呢?
kingcaiyao 2004-06-29
  • 打赏
  • 举报
回复
用API函数GetFileTime
futulove 2004-06-29
  • 打赏
  • 举报
回复
一楼的是个好方法

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧