如何通过在C#中首先优先考虑内部环境文件夹来从每个子文件夹读取文件? [英] How to read files from each subfolder by giving preference to inner environment folder first in c#?

查看:65
本文介绍了如何通过在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子文件夹内,还有三个子文件夹devstageprod,其他子文件夹folder2folder3完全相同.每个子文件夹中的每个devstageprod子文件夹都将具有被其覆盖的文件.

现在,我需要以某种方式更新我的上面的代码,以便当它从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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆