2012-04-12 5 views
1

간단한 코드 : directory 코드를 실행하는 하나 이상의 다른 사용자가 소유 경로인지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

리눅스. 나는 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