如何递归执行chmod?
How to perform chmod recursively?
如何在运行时将文件夹及其所有子文件夹的权限递归更改为 0777?
代码为 c++,mac。我包括了 ,它有 chmod
,但是没有关于如何递归执行它的文档。
最简单和最便携的方法是使用在 C++17 中添加的 std::filesystem
库。在那里,你会发现 recursive_directory_iterator
和许多其他方便的 类 和用于处理文件系统特定事物的函数。
示例:
#include <iostream>
#include <filesystem> // see notes about these two lines at the bottom
namespace fs = std::filesystem; // -"-
void chmodr(const fs::path& path, fs::perms perm) {
fs::permissions(path, perm); // set permissions on the top directory
for(auto& de : fs::recursive_directory_iterator(path)) {
fs::permissions(de, perm); // set permissions
std::cout << de << '\n'; // debug print
}
}
int main() {
chmodr("your_top_directory", fs::perms::all); // perms::all = 0777
}
但是,recursive_directory_iterator
在涉及的目录过多时会出现问题。它可能 运行 超出文件描述符,因为它需要保持许多目录打开。出于这个原因,我更喜欢使用 directory_iterator
来代替 - 并收集子目录以备后用。
示例:
#include <iostream>
#include <stack>
#include <utility>
#include <filesystem> // see notes about these two lines at the bottom
namespace fs = std::filesystem; // -"-
void chmodr(const fs::path& path, fs::perms perm) {
std::stack<fs::path> dirs;
dirs.push(path);
fs::permissions(path, perm);
do {
auto pa = std::move(dirs.top()); // extract the top dir from the stack
dirs.pop(); // and remove it
for(auto& de : fs::directory_iterator(pa)) {
// save subdirectories for later:
if(fs::is_directory(de)) dirs.push(de);
else fs::permissions(de, perm);
}
} while(!dirs.empty()); // loop until there are no dirs left
}
int main() {
chmodr("your_top_directory", fs::perms::all);
}
您可以阅读我在顶部。
在某些实现中,只有部分 C++17 支持,您可能会在 experimental/filesystem
中找到 filesystem
。如果是这样的话,你可以替换上面的
#include <filesystem>
namespace fs = std::filesystem;
使用我在 中提供的 #ifdef
丛林。
如何在运行时将文件夹及其所有子文件夹的权限递归更改为 0777?
代码为 c++,mac。我包括了 chmod
,但是没有关于如何递归执行它的文档。
最简单和最便携的方法是使用在 C++17 中添加的 std::filesystem
库。在那里,你会发现 recursive_directory_iterator
和许多其他方便的 类 和用于处理文件系统特定事物的函数。
示例:
#include <iostream>
#include <filesystem> // see notes about these two lines at the bottom
namespace fs = std::filesystem; // -"-
void chmodr(const fs::path& path, fs::perms perm) {
fs::permissions(path, perm); // set permissions on the top directory
for(auto& de : fs::recursive_directory_iterator(path)) {
fs::permissions(de, perm); // set permissions
std::cout << de << '\n'; // debug print
}
}
int main() {
chmodr("your_top_directory", fs::perms::all); // perms::all = 0777
}
但是,recursive_directory_iterator
在涉及的目录过多时会出现问题。它可能 运行 超出文件描述符,因为它需要保持许多目录打开。出于这个原因,我更喜欢使用 directory_iterator
来代替 - 并收集子目录以备后用。
示例:
#include <iostream>
#include <stack>
#include <utility>
#include <filesystem> // see notes about these two lines at the bottom
namespace fs = std::filesystem; // -"-
void chmodr(const fs::path& path, fs::perms perm) {
std::stack<fs::path> dirs;
dirs.push(path);
fs::permissions(path, perm);
do {
auto pa = std::move(dirs.top()); // extract the top dir from the stack
dirs.pop(); // and remove it
for(auto& de : fs::directory_iterator(pa)) {
// save subdirectories for later:
if(fs::is_directory(de)) dirs.push(de);
else fs::permissions(de, perm);
}
} while(!dirs.empty()); // loop until there are no dirs left
}
int main() {
chmodr("your_top_directory", fs::perms::all);
}
您可以阅读我在顶部。
在某些实现中,只有部分 C++17 支持,您可能会在 experimental/filesystem
中找到 filesystem
。如果是这样的话,你可以替换上面的
#include <filesystem>
namespace fs = std::filesystem;
使用我在 #ifdef
丛林。