2012-03-19 1 views
4

Я работаю над проектом, чтобы создать базу данных файлов, которые у меня есть в текущем каталоге. И одна из деталей, которые мне нужны о моих файлах, - это права на файлы, которые установлены с помощью chmod в ubuntu. (просто примечание: мне также понадобится информация о группе и владельце - например, chown - и если вы можете сообщить мне, может ли boost получить информацию о владельце, это будет здорово.)Как получить разрешения файлов с помощью библиотеки ускорения C++?

Я использую файловую систему boost и я проверил документацию много раз, но не смог найти, как получить разрешения.

In this page это показывает, что есть enum perms, который имеет строки разрешений для файлов, которые не отображаются на моей собственной файловой системе.hpp. (И я проверил, что у меня есть версия 1,49, также построенная из источника, чтобы быть уверенным). Также on the same page here это показывает, что он может получить разрешения, такие как:

perms permissions() const noexcept; 
//Returns: The value of 
//permissions() specified by the postconditions of the most recent call 
//to a constructor, operator=, or permissions(perms) function. 

Я не смогло найти функцию разрешений, ни место, где он хранит список завивки.

Это код, который у меня есть до сих пор (это на самом деле из учебных пособий, но я изменил его как рекурсивный), если бы вы могли рассказать мне, как получить разрешения/владельцы файлов или предложить другую библиотеку, чем повысить. ценить это.

EDIT: Я добавил s.permissions(), поскольку ethan_liou предложил, однако выход был не таким, как ожидалось. Вот обновленный код и вывод.

// filesystem tut4.cpp ---------------------------------------------------------------// 

// Copyright Beman Dawes 2009 

// Distributed under the Boost Software License, Version 1.0. 
// See http://www.boost.org/LICENSE_1_0.txt 

// Library home page: http://www.boost.org/libs/filesystem 

#include <iostream> 
#include <iterator> 
#include <vector> 
#include <algorithm> 
#include <boost/filesystem.hpp> 
#include <stdio.h> 
using namespace std; 
using namespace boost::filesystem; 
int read(path p); 

int main(int argc, char* argv[]) 
{ 
    if (argc < 2) 
    { 
     cout << "Usage: tut4 path\n"; 
     return 1; 
    } 

    path p (argv[1]); // p reads clearer than argv[1] in the following code 
    read(p); 


    return 0; 
} 
int read(path p) { 
    try 
    { 
     if (exists(p)) // does p actually exist? 
     { 
      if (is_symlink(p)) { 
       cout << p << " is a link\n"; 

      } 
      else if (is_regular_file(p)) { 
       // is p a regular file? 


       file_status s = status(p); 


       cout << p << " size is " << file_size(p) << " perms " << "" ; 
       printf("%o\n",s.permissions()); 
      } 

      else if (is_directory(p))  // is p a directory? 
      { 

       cout << p << " is a directory containing:\n"; 

       typedef vector<path> vec;    // store paths, 
       vec v;        // so we can sort them later 

       copy(directory_iterator(p), directory_iterator(), back_inserter(v)); 

       sort(v.begin(), v.end());    // sort, since directory iteration 
       // is not ordered on some file systems 

       for (vec::const_iterator it(v.begin()), it_end(v.end()); it != it_end; ++it) 
       { 
        //cout << " " << *it << '\n'; 
        read(*it); 
       } 
      } 
      else 
       cout << p << " exists, but is neither a regular file nor a directory\n"; 
     } 
     else 
      cout << p << " does not exist\n"; 
    } 

    catch (const filesystem_error& ex) 
    { 
     cout << ex.what() << '\n'; 
    } 
    return 0; 
} 

Выход:

$ ./a.out ~/Desktop/test 
"/home/usr/Desktop/test" is a directory containing: 
"/home/usr/Desktop/test/a.out" size is 69446 perms 27746424350 
"/home/usr/Desktop/test/la" is a directory containing: 
"/home/usr/Desktop/test/la/Untitled Document" size is 0 perms 27746424170 
"/home/usr/Desktop/test/la/lala" is a directory containing: 
"/home/usr/Desktop/test/la/lala/Link to lalalala" is a link 
"/home/usr/Desktop/test/la/lala/Untitled Folder" is a directory containing: 
"/home/usr/Desktop/test/la/lala/lalalala" size is 0 perms 0 
"/home/usr/Desktop/test/test.cpp" size is 2234 perms 0 
"/home/usr/Desktop/test/test.cpp~" size is 2234 perms 0 

Примечание: Эти цифры, которые, как 27746424350 изменения каждый раз, когда программа выполняется.

ответ

8
perms  permissions() const    { return m_perms; } 

определено в boost/filesystem/v3/operations.hpp

Добавить простой пример кода

#include <boost/filesystem.hpp> 
#include <stdio.h> 
namespace fs=boost::filesystem; 
int main(int argc,char * argv[]){ 
    fs::path p(argv[1]); 
    fs::file_status s = status(p); 
    printf("%o\n",s.permissions()); 
} 
+0

спасибо, вы случайно не знаете, как получить разрешения файла случайно? – Logan

+0

Я добавляю пример кода, он работает в boost 1.49 –

+0

Я протестировал его, как вы предлагали, но я не смог получить разрешения как 777 и т. Д. Они отображались как случайные числа, которые меняются каждый раз, когда программа выполняется, или они отображаются как 0. Я опубликовал новый источник и вывод, который я получаю. – Logan

-4

разрешения Пример файла для окон:

unsigned long attributes = ::GetFileAttributes(filePath.file_string().c_str()); 

if (attributes != 0xFFFFFFFF && (attributes & FILE_ATTRIBUTE_READONLY)) 
{ 
    attributes &= ~FILE_ATTRIBUTE_READONLY; 
    ::SetFileAttributes(filePath.file_string().c_str(), attributes); 
} 
+2

-1 Он не использует 'boost', как запросил OP. Также похоже, что вы просто скопировали код откуда-то, не зная, что он делает. – quantum

+3

-1, вопрос в частности о повышении на Ubuntu.Я не думаю, что код Win32, вероятно, будет особенно полезен. – Martin

Смежные вопросы