1

この単純なコード:

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

directoryコードを実行しているユーザー以外のユーザーが所有するパスの場合、「操作は許可されていません」という例外をスローします。

777またはパーミッションを持つディレクトリを扱っているので、これには少し混乱しています。シェルでrwxrwxrwx使用することで、変更時間を簡単に変更できます。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 );
4

1 に答える 1

1

touch -r file directoryも失敗するに違いない。これはfile、現在の時刻の代わりにのタイムスタンプを使用します。

動作に関する明示的なドキュメントは見つかりませんが、明示的な時刻を設定し、アクセスしているファイルを所有していない場合、基になる呼び出し(utimeまたは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 に答える