2012-04-12 11 views
1

この単純なコード:directoryコードを実行する1つ以上の他のユーザが所有しているパスである場合boost :: filesystem :: last_write_timeを正常に実行するためにはどのアクセス権が必要ですか?

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

は、「操作許可されていない」例外をスロー。

私は777またはrwxrwxrwx権限を持つディレクトリを扱ってるように私はこれで少し困惑している、と私は簡単にシェルでtouchを使用して、修正時刻を変更することができます。

何か不足していますか? 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

'GetLastError'と' SetFileTime'はWindows関数です。これはLinux、Cygwinなどでですか?タグごとに – leedm777

+0

linux。 Boostがそれらを再実装したと私は考えていました。あるいは、私は間違ったファイルを持っているかもしれません。ポイントは、それは奇妙な許可のものを除いて、動作します。 – UncleZeiv

答えて

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 

考えてみると意味があります。ファイル/ディレクトリへの書き込み権限がある場合は、手動で編集して変更時刻を今すぐに変更することができます。しかし、変更時間を別の時間に設定するには、所有権が必要です。

+0

ああ、これはパズルの欠けている部分だった。ありがとう! – UncleZeiv

関連する問題