成功执行boost :: filesystem :: last_write_time需要哪些权限?

时间:2012-04-12 12:13:52

标签: c++ linux file-permissions boost-filesystem

这个简单的代码:

std::time_t tm = boost::filesystem::last_write_time( filename );
boost::filesystem::last_write_time( directory, tm );
如果directory是由执行代码的用户以外的用户拥有的路径,则

抛出“不允许操作”异常。

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

我错过了什么吗? 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 );

1 个答案:

答案 0 :(得分:1)

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

我找不到关于行为的明确文档,但如果您设置了显式时间并且不拥有您正在触摸的文件,则基础调用(utimeutimensat)将失败。 / p>

$ 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

如果你考虑它就有意义了。如果您对文件/目录具有写入权限,则可以手动编辑以将修改时间更改为现在。但是将修改时间设置为其他时间需要所有权。