这个简单的代码:
std::time_t tm = boost::filesystem::last_write_time( filename );
boost::filesystem::last_write_time( directory, tm );
如果directory
是由执行代码的用户以外的用户拥有的路径,则抛出“不允许操作”异常。
我对此感到困惑,因为我处理的是具有777
或rwxrwxrwx
权限的目录,我可以通过在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 );
答案 0 :(得分:1)
我打赌touch -r file directory
也失败了。这将使用file
的时间戳而不是当前时间。
我找不到关于行为的明确文档,但如果您设置了显式时间并且不拥有您正在触摸的文件,则基础调用(utime
或utimensat
)将失败。 / 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
如果你考虑它就有意义了。如果您对文件/目录具有写入权限,则可以手动编辑以将修改时间更改为现在。但是将修改时间设置为其他时间需要所有权。