繁体   English   中英

从特定结构的子文件夹中获取文件?

[英]Get files from specifically structured sub-folders?

如何从特定结构化的文件夹/子文件夹系统中获取*.xml文件以执行某些操作。

例如:用户提供的路径(例如myPath )中的父文件夹的示例结构为

2017-36459-20124-301236\2017\36459\20124\301236\301236.xml

我不能使用string[] tarDir = Directory.GetDirectories(myPath, "foldernameinitial"); 因为文件夹名称是可变的。 有谁知道如何解决这个问题?

当我从您的评论中收集澄清信息时,这将使您获得仅包含文件的所有子目录,即最后一个子目录

static IEnumerable<string> GetLastDirectory(string path) =>
     Directory.GetDirectories(path, "*", SearchOption.AllDirectories)
       .Where(dir => Directory.GetDirectories(dir).Length == 0);

现在将其用作:

var MyDirectories = GetLastDirectory(@"D:\Softwares\Xtras"); //your path goes here
foreach (var subdir in MyDirectories)
{
   var onlyXMLfiles = Directory.GetFiles(subdir, "*.xml");
   foreach (var file in onlyXMLfiles)
   {
      //do your operation
   }
}

坦率地说,我不知道regex,我在regex101上尝试了这种模式匹配。 但是,正如您在下面的评论中所说,您还想匹配目录结构的模式,您可以执行以下操作:

string pattern = @"\d{4}-\d{4,10}-\d{4,10}-\d{4,10}\\\d{4}\\\d{4,10}\\\d{4,10}\\\d{4,10}";

//Now you won't have to use "GetLastDirectory", instead use "Directory.GetDirectories"
var MyDirectories = Directory.GetDirectories("your path goes here");
foreach (var subdir in MyDirectories)
{
    if ((Regex.Match(subdir, pattern) != Match.Empty))
    {
       var onlyXMLfiles = Directory.GetFiles(subdir, "*.xml");
       foreach (var file in onlyXMLfiles)
       {
           //do your operations
       }
    }         
}

可能的模式说明:

\        :   match keyword, maybe!?<br>
-        :   hyphen as mentioned in the folder structure<br>
\d       :   match digits only<br>
\d{4}    :   match digits of length 4 and above<br>
\d{4,10} :   match digits of length 4 and limit upto upto 10<br>
\\       :   match \ as in the folder path<br> 
 var job_folders = Directory.EnumerateDirectories(textBox1.Text, "*", SearchOption.TopDirectoryOnly);
            if (job_folders.ToArray().Length == 0)
            {
                MessageBox.Show("NO job folders are found...");
            }
            else
            {
                foreach (string job_folder in job_folders)
                {
                    var target_xml_file = Directory.GetFiles(job_folder, "*.xml", SearchOption.AllDirectories).Where(x => Path.GetFileName(Path.GetDirectoryName(x)).ToLower() == "xml");
                    var target_meta_file = Directory.GetFiles(job_folder, "*.xml", SearchOption.AllDirectories).Where(x => Path.GetFileName(Path.GetDirectoryName(x)).ToLower() == "meta");

                }
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM