我正在使用不支持目录高级目录操作的 c++ 框架 ( ROOT
(,所以当我在文件中生成我的(相当复杂(目录系统时,我通常最终会使用很多丑陋的嵌套 for 循环。我的问题是,是否有可能用一种不那么重复的方法替换这里显示的模式?使用像 lambda 这样接受其他 lambda 作为参数的东西,或者其他任何东西(链接的代码只是 dir 系统创建的一小部分(?
// Disk
t_outputFile -> cd("ROC_efficiency_disk_level_comparison");
gDirectory -> mkdir(layerDirName);
for(std::size_t sideIndex = 0, maxSideIndex = sideNames.size(); sideIndex < maxSideIndex; ++sideIndex)
{
const char* sideDirName = sideNames[sideIndex].c_str();
t_outputFile -> cd("ROC_efficiency_disk_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> mkdir(sideDirName);
gDirectory -> cd(sideDirName);
for(std::size_t diskIndex = 0, diskMaxIndex = diskNames.size(); diskIndex < diskMaxIndex; ++diskIndex)
{
const char* diskDirName = diskNames[diskIndex].c_str();
t_outputFile -> cd("ROC_efficiency_disk_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> mkdir(diskDirName);
}
}
// Disk-ring
t_outputFile -> cd("ROC_efficiency_disk-ring_level_comparison");
gDirectory -> mkdir(layerDirName);
for(std::size_t sideIndex = 0, maxSideIndex = sideNames.size(); sideIndex < maxSideIndex; ++sideIndex)
{
const char* sideDirName = sideNames[sideIndex].c_str();
t_outputFile -> cd("ROC_efficiency_disk-ring_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> mkdir(sideDirName);
gDirectory -> cd(sideDirName);
for(std::size_t diskIndex = 0, diskMaxIndex = diskNames.size(); diskIndex < diskMaxIndex; ++diskIndex)
{
const char* diskDirName = diskNames[diskIndex].c_str();
t_outputFile -> cd("ROC_efficiency_disk-ring_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> mkdir(diskDirName);
gDirectory -> cd(diskDirName);
for(std::size_t ringIndex = 0, ringMaxIndex = ringNames.size(); ringIndex < ringMaxIndex; ++ringIndex)
{
const char* ringDirName = ringNames[ringIndex].c_str();
t_outputFile -> cd("ROC_efficiency_disk-ring_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> cd(diskDirName);
gDirectory -> mkdir(ringDirName);
}
}
}
// Blade
t_outputFile -> cd("ROC_efficiency_blade_level_comparison");
gDirectory -> mkdir(layerDirName);
for(std::size_t sideIndex = 0, maxSideIndex = sideNames.size(); sideIndex < maxSideIndex; ++sideIndex)
{
const char* sideDirName = sideNames[sideIndex].c_str();
t_outputFile -> cd("ROC_efficiency_blade_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> mkdir(sideDirName);
gDirectory -> cd(sideDirName);
for(std::size_t diskIndex = 0, diskMaxIndex = diskNames.size(); diskIndex < diskMaxIndex; ++diskIndex)
{
const char* diskDirName = diskNames[diskIndex].c_str();
t_outputFile -> cd("ROC_efficiency_blade_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> mkdir(diskDirName);
gDirectory -> cd(diskDirName);
for(std::size_t ringIndex = 0, ringMaxIndex = ringNames.size(); ringIndex < ringMaxIndex; ++ringIndex)
{
const char* ringDirName = ringNames[ringIndex].c_str();
t_outputFile -> cd("ROC_efficiency_blade_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> cd(diskDirName);
gDirectory -> mkdir(ringDirName);
gDirectory -> cd(ringDirName);
for(std::size_t bladeIndex = 0, bladeMaxIndex = bladeNames.size(); bladeIndex < bladeMaxIndex; ++bladeIndex)
{
const char* bladeDirName = bladeNames[bladeIndex].c_str();
t_outputFile -> cd("ROC_efficiency_blade_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> cd(diskDirName);
gDirectory -> cd(ringDirName);
gDirectory -> mkdir(bladeDirName);
}
}
}
}
对它的作用有一个易于理解的解释:它返回到文件中的根目录,然后在那里创建许多目录,每个目录都包含相同的子目录系统。不同情况下的深度是不同的,每次创建新的子目录时,程序必须先返回到根目录。
例:
├── FPix/
│ ├── Positive_Side
│ │ ├─ Disk_1
│ │ │ ├─ Ring_1
│ │ │ │ └─ Some_other_nested_levels
│ │ │ └─ Ring_2
│ │ │ └─ Some_other_nested_levels
│ │ ├─ Disk_2
│ │ │ ├─ Ring_1
│ │ │ │ └─ Some_other_nested_levels
│ │ │ └─ Ring_2
│ │ │ └─ Some_other_nested_levels
│ │ └─ ...
│ │ └─ Same_as_the_other_disks
│ │
│ └── Negative_side
│ └─ Same_as_the_positive_side
│
├── ROC_efficiency_disk_level_comparison
│ └─ The_nesting_here_only_goes_until_disks
│ └─ ...
│
├── ROC_efficiency_ring_level_comparison
│ └─ The_nesting_here_only_goes_until_rings
│ └─ ...
│
└── Many_many_other_directories_that_have_the_same_dirs_but_different_levels_of_nesting
您可以将已发布的示例结构定义为树,将根目录定义为根目录,将子文件夹定义为节点,将这些目录的子目录定义为这些节点的节点,等等(直到到达目录结构的末尾(。然后你可以做一些类似的事情
def treedir(root):
os.mkdir(root)
for son in nodes:
treedir(son)
这将生成整个结构,假设您正确定义了树。
编辑:我刚刚意识到我发布了python代码,而您正在使用C++,但我相信您已经了解了大致的想法。