1

这个简单的代码:

std::time_t tm = boost::filesystem::last_write_time( filename );
boost::filesystem::last_write_time( directory, tm );

directory如果用户拥有的路径不是执行代码的用户,则抛出“不允许操作”异常。

我对此感到有些困惑,因为我正在处理具有777rwxrwxrwx权限的目录,并且我可以通过touch在 shell 中使用轻松更改它们的修改时间。

我错过了什么吗?Boost 是否要求比它需要的更多权限?有没有办法解决这个问题?

这是Boost中的相关代码:

handle_wrapper hw(
  create_file( ph.c_str(), FILE_WRITE_ATTRIBUTES,
    FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
    OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ) );
if ( hw.handle == INVALID_HANDLE_VALUE )
  return error_code( ::GetLastError(), system_category );
return error_code( ::SetFileTime( hw.handle, 0, 0, &last_write_time ) != 0
  ? 0 : ::GetLastError(), system_category );
4

1 回答 1

1

我打赌touch -r file directory也失败了。这将使用时间戳file而不是当前时间。

我找不到有关该行为的明确文档,但是如果您既设置了明确的时间并且不拥有您正在触摸的文件,则基础调用 ( utimeor ) 将失败。utimensat

$ touch foo
$ touch bar
$ sudo chmod a+rw bar
$ sudo chown root.root bar
$ touch bar
# success
$ touch -r foo bar
touch: setting times of `bar': Operation not permitted

如果您考虑一下,这是有道理的。如果您对文件/目录具有写入权限,则可以手动编辑以将修改时间更改为现在。但是将修改时间设置为其他时间需要所有权。

于 2012-04-12T20:45:41.413 回答