如何通过在c#中优先选择内部环境文件夹从每个子文件夹读取文件?

如何通过在c#中优先选择内部环境文件夹从每个子文件夹读取文件?,c#,linq,file,asp.net-core,C#,Linq,File,Asp.net Core,我有一个这样的文件夹结构- Products ├── folder1 │ ├── files1.json │ ├── files2.json │ └── files3.txt ├── folder2 │ ├── files4.json │ ├── files5.json │ └── files6.txt └── folder3 ├── files10.json ├── files7.json ├── files8.json └── file

我有一个这样的文件夹结构-

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
,然后里面有一堆子文件夹。每个子文件夹中都有一堆文件。为了简单起见,我提出了子文件夹名为
文件夹{number}
,文件名为
文件{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;
}
例如,在
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
对于folder3它应该只读取该级别的所有文件,因为它没有任何特定于环境的文件夹

我应该如何修改上面的
C#
代码,以便它可以首先为每个子文件夹的
dev
文件夹中的所有文件赋予优先权,然后从相应的子文件夹层次结构中读取其余文件

我应该如何修改我上面的C代码,以便它能够 每个文件夹的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;
        }
私有静态列表读取文件(字符串路径)
{ 
var allFiles=新列表();
var subFolders=Directory.EnumerateDirectories(path.ToList();
var fileType=new List(){“*.json”,“*.txt”};
for(int i=0;i!subSubFolders.Any(y=>x.Contains(y)).ToList();
var subDev=Directory.GetFiles(sub,fileType[i],SearchOption.AllDirectories)。其中(x=>x.Contains(“dev”)).ToList();
foreach(jsonfile中的var项)
{
var dd=subDev.Where(x=>(Path.GetFileName(x)=Path.GetFileName(item)).FirstOrDefault();
添加(dd==null?项:dd);
}
var extraFileDev=subDev.Where(x=>!jsonFiles.Any(y=>y.Contains(Path.GetFileName(x))).ToList();
foreach(extraFileDev中的变量项)
{
所有文件。添加(项);
}
}
}
返回所有文件;
}

此查询适用于我:

IEnumerable<string> query =
    from directory in System.IO.Directory.EnumerateDirectories(products) //1
    let dev = System.IO.Path.Combine(directory, "dev") //2
    from file in System.IO.Directory.EnumerateFiles(directory) //3
    let fi = new System.IO.FileInfo(file) //4
    let dev_file = System.IO.Path.Combine(dev, fi.Name) //5
    select System.IO.File.Exists(dev_file) ? dev_file : file; //6

根据您在下面的评论,以下是有效的查询:

IEnumerable<string> query =
    from directory in Directory.EnumerateDirectories(products)
    let dev = Path.Combine(directory, "dev")
    from ext in new [] { "txt", "json" }
    from file in 
        Enumerable
            .Concat(
                Directory.Exists(dev)
                    ? Directory.EnumerateFiles(dev, $"*.{ext}")
                    : Enumerable.Empty<string>(),
                Directory.EnumerateFiles(directory, $"*.{ext}"))
            .Select(f => new FileInfo(f))
            .GroupBy(f => f.Name)
            .SelectMany(x => x.Take(1))
            .Select(x => x.FullName)
    select file;

你是说你不再喜欢SearchOption.AllDirectories了。如果出现这种情况,请改用Directory.EnumerateFiles()并根据需要递归。“优先”是什么例如,如果
file1
存在于
folder1
级别中,并且我们在
dev
文件夹
folder1
中有相同的
file1
但内容完全不同,那么我的代码应该使用
folder1
文件夹中的
file1
folder1
level。这就是偏好在这里的基本含义。如果没有意义,请告诉我。创建一个具有文件完整路径以及额外属性的类/结构。a) 布尔值,无论它是否在dev文件夹中。b) “自适应”路径-与完整路径相同,但如果存在,则删除
dev
。现在将所有文件添加到
列表中
。现在创建一个
字典
。按a)布尔降序排列列表(即先有开发人员),并按顺序(如果他们不存在)添加到字典中,由b)键控。Net effect-您需要的所有文件
...\Products\folder1\dev\file1.txt 
...\Products\folder1\file2.txt 
...\Products\folder1\file3.txt 
...\Products\folder2\file4.txt 
...\Products\folder2\dev\file5.txt 
...\Products\folder2\file6.txt 
...\Products\folder3\file10.txt 
...\Products\folder3\file7.txt 
...\Products\folder3\file8.txt 
...\Products\folder3\file9.txt 
IEnumerable<string> query =
    from directory in Directory.EnumerateDirectories(products)
    let dev = Path.Combine(directory, "dev")
    from ext in new [] { "txt", "json" }
    from file in 
        Enumerable
            .Concat(
                Directory.Exists(dev)
                    ? Directory.EnumerateFiles(dev, $"*.{ext}")
                    : Enumerable.Empty<string>(),
                Directory.EnumerateFiles(directory, $"*.{ext}"))
            .Select(f => new FileInfo(f))
            .GroupBy(f => f.Name)
            .SelectMany(x => x.Take(1))
            .Select(x => x.FullName)
    select file;
...\Products\folder1\dev\file1.txt 
...\Products\folder1\dev\file42.txt 
...\Products\folder1\file2.txt 
...\Products\folder1\file3.txt 
...\Products\folder1\dev\file84.json 
...\Products\folder1\file4.json 
...\Products\folder2\dev\file5.txt 
...\Products\folder2\file4.txt 
...\Products\folder2\file6.txt 
...\Products\folder3\file10.txt 
...\Products\folder3\file7.txt 
...\Products\folder3\file8.txt 
...\Products\folder3\file9.txt