如何通过在C#中首先优先考虑内部环境文件夹来从每个子文件夹读取文件? [英] How to read files from each subfolder by giving preference to inner environment folder first in c#?
问题描述
我有这样的文件夹结构-
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
. - 它应该从folder2级别读取
files4.json
. - 它应该从folder2级别读取
files6.txt
.
对于文件夹3 ,它应该仅读取该级别的所有文件,因为它没有任何特定于环境的文件夹.
如何修改上面的C#
代码,以便它可以为每个子文件夹的dev
文件夹中的所有文件赋予优先级/优先级,然后可以从相应的子文件夹层次结构中读取其余文件.
我应该如何修改我上面的C#代码,以便它可以给出 每个文件夹都来自dev文件夹中所有文件的优先级/优先级 子文件夹,然后可以读取的剩余文件 相应的子文件夹层次结构.
要实现此目的,您只需添加一些逻辑代码即可.
首先获取Products
文件夹下的three-level folder
的名称,然后通过判断该文件是否包含dev文件夹的名称来确定如何将该文件添加到所有文件 .>
如果是,请使用 SequenceEqual 方法将dev中的文件与文件夹下的文件进行比较.如果内容相同,请在dev中添加文件.如果没有dev文件夹,则直接将该文件夹下的文件添加到allFiles.
更新
这是逻辑代码:
private static List<string> ReadFiles(string path)
{
var allFiles = new List<string>();
var subFolders = Directory.EnumerateDirectories(path).ToList();
var fileType = new List<string>() { "*.json", "*.txt" };
for (int i = 0; i < fileType.Count; i++)
{
foreach (var sub in subFolders)
{
var subSubFolders = Directory.EnumerateDirectories(sub).ToList();
var jsonFiles = Directory.GetFiles(sub, fileType[i], SearchOption.AllDirectories).Where(x => !subSubFolders.Any(y => x.Contains(y))).ToList();
var subDev = Directory.GetFiles(sub, fileType[i], SearchOption.AllDirectories).Where(x => x.Contains("dev")).ToList();
foreach (var item in jsonFiles)
{
var dd = subDev.Where(x => (Path.GetFileName(x) == Path.GetFileName(item))).FirstOrDefault();
allFiles.Add(dd == null ? item : dd);
}
var extraFileDev = subDev.Where(x => !jsonFiles.Any(y => y.Contains(Path.GetFileName(x)))).ToList();
foreach (var item in extraFileDev)
{
allFiles.Add(item);
}
}
}
return allFiles;
}
I have a folder structure like this -
Products
├── folder1
│ ├── files1.json
│ ├── files2.json
│ └── files3.txt
├── folder2
│ ├── files4.json
│ ├── files5.json
│ └── files6.txt
└── folder3
├── files10.json
├── files7.json
├── files8.json
└── files9.txt
I have a root folder Products
and then bunch of sub-folders inside it. Each of those sub-folder has bunch of files in it. Just for simplicity I came up with sub-folders name as folder{number}
and files name as files{number}.json
or .txt
but in general they have different names. In general I have 20 different sub-folders inside root folder and each sub-folder has around 30 files max.
Below is the code which reads above folder structure and read all the files from it. In the below code path
variable has Products
value which is the root folder name.
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;
}
Problem Statement
Now I have to change my folder structure in a different format as shown below:
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
For example - Inside folder1
sub-folder there are three more sub-folders dev
, stage
and prod
and exactly same thing for other sub-folders folder2
and folder3
. Each of those dev
, stage
and prod
sub-folder inside each sub-folder will have files which are overridden for them.
Now I need to update my above code in such a way so that when it reads the file from Products
root folder, it should take whatever is in dev
folder for each sub-folder as first preference (meaning it should override if same file is present at sub-folder level) and then everything else (other files) it should take from corresponding sub-folder. So for example this should be the way it should read all the files from each sub-folders for above example -
For folder1 -
- It should read
files1.json
from dev folder of folder1. - It should read
files2.json
from folder1 level. - It should read
files3.txt
from folder1 level.
For folder2 -
- It should read
files5.json
from dev folder of folder2. - It should read
files4.json
from folder2 level. - It should read
files6.txt
from folder2 level.
For folder3 it should read all files from that level only since it doesn't have any environment specific folders.
How should I modify my above C#
code so that it can give preference/priority to all the files from dev
folder for each sub-folder first and then remaining files it can read from corresponding sub-folder hierarchy.
How should I modify my above C# code so that it can give preference/priority to all the files from dev folder for each sub-folder first and then remaining files it can read from corresponding sub-folder hierarchy.
To achieve this,you only need to add some logic code.
First get the name of the three-level folder
under the Products
folder, and then determine how to add the file to allFiles by judging whether it contains the name of the dev folder.
If it does, use the SequenceEqual method to compare the file in dev with the file under folder, If the content is the same, add the file in dev. If there is no dev folder, directly add the files under the folder to allFiles.
Update
Here is the logic code:
private static List<string> ReadFiles(string path)
{
var allFiles = new List<string>();
var subFolders = Directory.EnumerateDirectories(path).ToList();
var fileType = new List<string>() { "*.json", "*.txt" };
for (int i = 0; i < fileType.Count; i++)
{
foreach (var sub in subFolders)
{
var subSubFolders = Directory.EnumerateDirectories(sub).ToList();
var jsonFiles = Directory.GetFiles(sub, fileType[i], SearchOption.AllDirectories).Where(x => !subSubFolders.Any(y => x.Contains(y))).ToList();
var subDev = Directory.GetFiles(sub, fileType[i], SearchOption.AllDirectories).Where(x => x.Contains("dev")).ToList();
foreach (var item in jsonFiles)
{
var dd = subDev.Where(x => (Path.GetFileName(x) == Path.GetFileName(item))).FirstOrDefault();
allFiles.Add(dd == null ? item : dd);
}
var extraFileDev = subDev.Where(x => !jsonFiles.Any(y => y.Contains(Path.GetFileName(x)))).ToList();
foreach (var item in extraFileDev)
{
allFiles.Add(item);
}
}
}
return allFiles;
}
这篇关于如何通过在C#中首先优先考虑内部环境文件夹来从每个子文件夹读取文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!