【问题标题】:Last write FILETIME always returning current time最后写入 FILETIME 总是返回当前时间
【发布时间】:2015-10-13 23:07:46
【问题描述】:

我需要将文件的最后修改时间与存储在数据库中的日期时间进行比较。我最初查看this question 开始。

我目前正在获取文件最后一次写入的FILETIME,并将其转换为SYSTEMTIME。然后我使用那个SYSTEMTIME 创建一个TDateTime 对象,我可以用它来进行比较。然而,FileModifiedDT 变量总是显示为当前时间,尽管该文件之前已被修改过。

FILETIME lastWriteTime;

String * FileNamePtr = new String( FileName );

GetFileTime( FileNamePtr, NULL, NULL, &lastWriteTime );

SYSTEMTIME systemTime;
FileTimeToSystemTime( &lastWriteTime, &systemTime );

TDateTime * FileModifiedDT = new TDateTime( systemTime.wYear, systemTime.wMonth,
                                            systemTime.wDay, systemTime.wHour,
                                            systemTime.wMinute, systemTime.wSecond,
                                            systemTime.wMilliseconds );

我是否以某种方式错过了GetFileTime?有没有更好的方法可以解决这个问题?

【问题讨论】:

  • 你在哪个windows系统上?
  • GetFileTime 成功了吗?试试if(....)
  • GetFileTime:"如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError。"
  • 是的。您需要传递从对CreateFile 的调用中获得的HANDLE,而不是路径名。
  • 附带说明,停止对不需要的类型使用指针:String sFileName = FileName; ... TDateTime FileModifiedDT( systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond, systemTime.wMilliseconds );。在将SYSTEMTIME 转换为TDateTime 的情况下,RTL 有一个SystemTimeToDateTime() 函数:TDateTime FileModifiedDT = SystemTimeToDateTime( systemTime );

标签: c++ datetime winapi windows-8.1 c++builder-xe7


【解决方案1】:

错误是

String * FileNamePtr = new String( FileName );
GetFileTime( FileNamePtr, NULL, NULL, &lastWriteTime );

根据documentation,第一个参数必须是由CreateFile 创建的文件句柄,没有别的。

因此你需要这样的东西:

HANDLE fileHandle = CreateFile(
  FileName, //LPCTSTR
  GENERIC_READ,
  FILE_SHARE_READ,
  NULL,
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  NULL
);

if ( fileHandle != INVALID_HANDLE )
{
    GetFileTime( fileHandle, NULL, NULL, &lastWriteTime );
    CloseHandle( fileHandle );
}
else
{
    // error, do something else...
}

【讨论】:

  • 如果不想打开文件,可以使用FindFirstFile()(被C++Builder的Sysutils::FindFirst()函数包裹)或者GetFileAttributesEx()代替。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多