Я работаю над проектом по созданию базы данных из моих файлов в текущем каталоге. И одна из деталей, которые я хочу узнать о моих файлах, - это права доступа к файлам, которые установлены с помощью chmod в ubuntu. (просто примечание: мне также понадобится информация о группе и владельце - например, chown - и если вы могли бы сообщить мне, может ли boost получить информацию о владельце, это было бы здорово.)
Я использую библиотеку файловой системы boost и неоднократно проверял документацию, но не мог найти, как получить разрешения.
На этой странице это показывает, что есть enum perms
, у которого есть строки разрешения файла, которые не отображаются в моей собственной файловой системе .hpp. (И я проверил, что у меня есть версия 1.49, также собранная из исходного кода, чтобы быть уверенной). Также на той же странице здесь это показывает, что он может получить разрешения вроде:
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.
Мне не удалось найти ни функцию разрешений, ни место, где она хранит список разрешений.
Это код, который у меня есть (который на самом деле взят из уроков повышения, но я изменил его, чтобы он был рекурсивным), если бы вы могли сказать мне, как получить права доступа к файлу / владения или предложить другую библиотеку, отличную от наддува, я был бы признателен это.
РЕДАКТИРОВАТЬ: я добавил 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
, меняются при каждом запуске программы.