VC 如何使用SetFileTime?

ISABCJJ 2009-05-06 11:37:40
使用SetFileTime()修改文件时间失败!分析错误代码是6,是句柄无效!请高手指点如何使用?
	if(m_strFilePath == "")
{
AfxMessageBox("请先选择要获取属性的文件");
return;
}
//获取文件属性信息
m_hFile = FindFirstFile(m_strFilePath, &FindFileData);

//备份文件属性
strcpy(FileInfo.szFileTitle, FindFileData.cFileName);

FileInfo.dwFileAttributes = FindFileData.dwFileAttributes;
FileInfo.ftCreationTime = FindFileData.ftCreationTime;
FileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;
FileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;
FileInfo.dwFileSizeHigh = FindFileData.nFileSizeHigh;
FileInfo.dwFileSizeLow = FindFileData.nFileSizeLow;

FileInfo.ftCreationTime.dwLowDateTime += 1;
FileInfo.ftCreationTime.dwHighDateTime += 10;
BOOL bResult ;
bResult = SetFileTime(m_hFile, //待写入的文件句柄
&FileInfo.ftCreationTime, //文件的创建时间
&FileInfo.ftLastAccessTime, //文件最近一次的访问时间
&FileInfo.ftLastWriteTime); //文件最近一次的修改时间

if(!bResult)
{
DWORD dwErr = GetLastError();
}

FindClose(m_hFile);


指导文件的路径m_strFilePath,如何获取SetFileTime需要的参数句柄?
...全文
1105 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cem_uestc 2011-10-14
  • 打赏
  • 举报
回复
完整代码:
CTime ct=CTime::GetCurrentTime();
SYSTEMTIME st,sttmp;
ct.GetAsSystemTime(st);
FILETIME ft1,ft;
::SystemTimeToFileTime(&st, &ft1);
::LocalFileTimeToFileTime(&ft1,&ft);
///////////////////////

file.Open(fileName,CFile::modeWrite|CFile::typeBinary);
SetFileTime((HANDLE)file.m_hFile, //待写入的文件句柄
&ft, //文件的创建时间
&ft, //文件最近一次的访问时间
&ft); //文件最近一次的修改时间
file.Close();
cem_uestc 2011-10-14
  • 打赏
  • 举报
回复
原来少了一个时间转换, LocalFileTimeToFileTime函数将本地的FILETIME时间转换为对应的UTC的FILETIME时间。这样就得到了本地时间,不相差8个小时了
::LocalFileTimeToFileTime(&ft1,&ft);
cem_uestc 2011-10-14
  • 打赏
  • 举报
回复
我修改文件创建时间的时候出现问题,测试保存当前时间,但打开文件属性时,时间往后推迟了8个小时,测试函数:

CTime ct=CTime::GetCurrentTime();
SYSTEMTIME st,sttmp;
ct.GetAsSystemTime(st);
FILETIME ft;
::SystemTimeToFileTime(&st, &ft);
///////////////////////

//
file.Open(fileName,CFile::modeWrite|CFile::typeBinary);
SetFileTime((HANDLE)file.m_hFile, //待写入的文件句柄
&ft, //文件的创建时间
&ft, //文件最近一次的访问时间
&ft); //文件最近一次的修改时间
file.Close();
残诗 2010-01-06
  • 打赏
  • 举报
回复
改成这样就行了,并且修改文件创建时间最好使用SystemTimeToFileTime和FileTimeToSystemTime

CFile file(m_strFilePath,CFile::modeWrite|CFile::typeBinary); //打开文件
bResult = SetFileTime((HANDLE)file.m_hFile, //待写入的文件句柄
&FileInfo.ftCreationTime, //文件的创建时间
&FileInfo.ftLastAccessTime, //文件最近一次的访问时间
&FileInfo.ftLastWriteTime); //文件最近一次的修改时间
if(!bResult)
{
DWORD dwErr = GetLastError();
}

//SetFileAttributes();
file.Close(); //关闭
jingzhongrong 2009-05-06
  • 打赏
  • 举报
回复
FindFirstFile返回的值是用于FindNextFile后续使用的,要用CreateFile打开文件句柄
wnx_u 2009-05-06
  • 打赏
  • 举报
回复
m_strFilePath所指向的文件存在不?

if(m_strFilePath == "")
{
AfxMessageBox("请先选择要获取属性的文件");
return;
}
而且这句代码有问题,如果m_strFilePath是CString型,应该用IsEmpty()方法来判断是否为空,如果m_strFilePath为char*,应该用strcmp来判断.
cppzhentan 2009-05-06
  • 打赏
  • 举报
回复

::CreateFile("文件名", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); // 返回的句柄就是文件句柄

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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