【发布时间】:2020-08-31 21:34:38
【问题描述】:
我有这样的文件夹结构 -
Products
├── folder1
│ ├── files1.json
│ ├── files2.json
│ └── files3.txt
├── folder2
│ ├── files4.json
│ ├── files5.json
│ └── files6.txt
└── folder3
├── files10.json
├── files7.json
├── files8.json
└── files9.txt
我有一个根文件夹Products,然后里面有一堆子文件夹。这些子文件夹中的每一个都有一堆文件。为简单起见,我想出了子文件夹名称为folder{number},文件名称为files{number}.json 或.txt,但通常它们有不同的名称。一般来说,我在根文件夹中有 20 个不同的子文件夹,每个子文件夹最多有大约 30 个文件。
以下是读取上述文件夹结构并从中读取所有文件的代码。在下面的代码中,path 变量具有 Products 值,即根文件夹名称。
private IList<string> ReadFiles(string path)
{
var jsonFiles = Directory.GetFiles(path, "*.json", SearchOption.AllDirectories);
var textFiles = Directory.GetFiles(path, "*.txt", SearchOption.AllDirectories);
var allFiles = new List<string>(jsonFiles);
allFiles.AddRange(textFiles);
return allFiles;
}
问题陈述
现在我必须以不同的格式更改我的文件夹结构,如下所示:
Products
├── folder1
│ ├── dev
│ │ └── files1.json
│ ├── files1.json
│ ├── files2.json
│ ├── files3.txt
│ ├── prod
│ │ └── files1.json
│ └── stage
│ └── files1.json
├── folder2
│ ├── dev
│ │ └── files5.json
│ ├── files4.json
│ ├── files5.json
│ ├── files6.txt
│ ├── prod
│ │ └── files5.json
│ └── stage
│ └── files5.json
└── folder3
├── files10.json
├── files7.json
├── files8.json
└── files9.txt
例如 - 在 folder1 子文件夹中,还有三个子文件夹 dev、stage 和 prod,其他子文件夹 folder2 和 folder3 完全相同。每个子文件夹中的 dev、stage 和 prod 子文件夹中的每个子文件夹都将包含为其覆盖的文件。
现在我需要以这样一种方式更新我的上述代码,以便当它从 Products 根文件夹读取文件时,它应该将每个子文件夹的 dev 文件夹中的任何内容作为首选(意思是如果相同的文件存在于子文件夹级别,则应覆盖),然后应从相应的子文件夹中获取其他所有文件(其他文件)。因此,例如,这应该是它应该从上述示例的每个子文件夹中读取所有文件的方式 -
对于文件夹 1 -
- 应该从 folder1 的 dev 文件夹中读取
files1.json。 - 它应该从 folder1 级别读取
files2.json。 - 它应该从 folder1 级别读取
files3.txt。
对于文件夹 2 -
- 它应该从 folder2 的 dev 文件夹中读取
files5.json。 - 它应该从文件夹 2 级别读取
files4.json。 - 它应该从文件夹 2 级别读取
files6.txt。
对于文件夹 3,它应该只读取该级别的所有文件,因为它没有任何特定于环境的文件夹。
我应该如何修改我上面的C# 代码,以便它可以首先为每个子文件夹的dev 文件夹中的所有文件提供首选项/优先级,然后是它可以从相应的子文件夹层次结构中读取的剩余文件。
【问题讨论】:
-
所以你说你不再喜欢 SearchOption.AllDirectories。如果发生这种情况,请改用 Directory.EnumerateFiles() 并根据需要进行递归。
-
“给予优先”是什么意思?
-
@JonathanWood 例如,如果
file1存在于folder1级别内,并且我们在dev文件夹内有相同的file1folder1但内容完全不同,所以我的代码应该使用@来自folder1的dev文件夹的987654354@ 不是来自folder1级别的file1。这就是偏好在这里的基本含义。如果这没有意义,请告诉我。 -
创建一个类/结构,它具有文件的完整路径以及额外的属性。 a) 布尔值是否在 dev 文件夹中。 b) “已调整”路径 - 与完整路径相同,但如果存在
dev,则将其删除。现在将所有文件添加到List<YourNewType>。现在创建一个Dictionary<string, YourNewType>。按 a) 布尔值降序排列您的列表(即首先有 dev 的)并将它们按顺序(如果它们不存在)添加到字典中,由 b 键控)。净效应 - 您想要在字典中的所有文件,优先考虑开发文件(首先添加)。 -
我发现这个问题过于宽泛,更像是“为我编写代码”之类的问题。这里的根本问题是您没有编写任何会排除文件的代码,所以当然没有文件被排除在外。次要问题是您同时检索所有文件,因此您没有方便的方法来区分在“dev”目录中找到的文件,甚至是在其他“环境”目录中找到的文件。你应该从编写一个真正的规范开始。您在此处发布的只是一些示例,并非规范。
标签: c# linq file asp.net-core