【问题标题】:How to get all the files form a directory where name does not contains 0?如何从名称不包含 0 的目录中获取所有文件?
【发布时间】:2018-11-27 12:45:32
【问题描述】:

最近我构建了一个小型转换器,可以将txt数据转换为特定结构的xml,我选择一个文件夹,程序循环遍历该文件夹中的所有文件,并以XML格式一起写入一个xml文档.

在文件夹中,我的数据名称如下:

数据.0001.txt

Data.0002.txt

Data.0003.txt

Data.0004.txt

数据.txt

等等

我只想要其中不包含零的文件,因为带有零的文件只是其他文件的备份副本,我有超过 6000 个文件,我无法手动过滤它们

这是我目前的代码

 static void Main(string[] args)
    {
        FolderBrowserDialog SelectFolder = new FolderBrowserDialog();
        String path = @"C:\newpages";

        XmlDocument doc = new XmlDocument();
        XmlElement root = doc.CreateElement("Pages");

        if (SelectFolder.ShowDialog() == DialogResult.OK)
        {
            var txt = string.Empty;
            string[] Files = Directory.GetFiles((SelectFolder.SelectedPath));
            int i = 1;
            foreach (string path1 in Files)
            {              
                String filename = Path.GetFileNameWithoutExtension((path1));
                using (StreamReader sr = new StreamReader(path1))
                {
                    txt = sr.ReadToEnd();
                    XmlElement id = doc.CreateElement("Page.id");
                    id.SetAttribute("Page.Nr", i.ToString());
                    id.SetAttribute("Pagetitle",  filename);
                    XmlElement name = doc.CreateElement("PageContent");
                    XmlCDataSection cdata = doc.CreateCDataSection(txt);
                    name.AppendChild(cdata);
                    id.AppendChild(name);  // page id appenndchild         
                    root.AppendChild(id);  // roots appenedchild
                    doc.AppendChild(root); //Main root

                }
             i++;
            }
        }
        Console.WriteLine("finished");
        Console.ReadKey();

        doc.Save(Path.ChangeExtension(path, ".xml"));

    }
}

任何帮助都会非常好人

【问题讨论】:

  • 不能像你的foreach循环if(!filename.Contains("0"))那样简单
  • @AfnanAhmad 是的,实际上我是如此绝望,以至于我什至没有想到它应该是“.0”,因为总是有一个“。” ,谢谢你的帮助

标签: c# xml


【解决方案1】:

GetFiles 返回指定目录中的文件名。它的返回类型是string[],因此您可以轻松地应用Where 来过滤file 名称,如下所示:-

 var files = Directory.GetFiles("PathToYourDirec").Where(name => !name.Contains("0"));

【讨论】:

  • 不知道这么简单,谢谢工作,其他所有工作都很好
  • @PassionateCoder 很高兴它有帮助。
【解决方案2】:

在字符串文件名上,您可以确保它不包含“0”

if(!filename.Contains("0"))
    {

    }

【讨论】:

    【解决方案3】:

    Files 变量上,您可以使用正则表达式过滤掉仅包含字母的文件名

    var reg = new Regex(@"^([^0-9]*)$");
    var files = Directory.GetFiles("path-to-folder")
                         .Where(path => reg.IsMatch(path))
                         .ToList();
    

    【讨论】:

    • 我一开始尝试使用正则表达式,但它对我不起作用,我会用你写的代码再试一次,谢谢
    • 没问题。如果它解决了您的问题,请点赞或接受。
    • 我投了赞成票,但似乎我不能投票对不起,我的声望不到 15 :D 有点新,但这总是要理解这些正则表达式
    • 没问题,@PassionateCoder! :)
    【解决方案4】:

    在解决这个问题的同时,整个代码可以大大简化。您不需要 StreamReader 来读取整个文件,您不妨尽早获取文件名并进行过滤,而不是进入 foreach 和过滤:

    static void Main(string[] args)
    {
        FolderBrowserDialog SelectFolder = new FolderBrowserDialog();
        String path = @"C:\newpages";
    
        XmlDocument doc = new XmlDocument();
        XmlElement root = doc.CreateElement("Pages");
    
        if (SelectFolder.ShowDialog() == DialogResult.OK)
        {
            // Don't declare txt here, you're overwriting and only using it in a nested loop, declare it as you use it there
            // var txt = string.Empty;
    
            //string[] Files = Directory.GetFiles((SelectFolder.SelectedPath));
            // Change to getting FileInfos
            var Files = new DirectoryInfo(SelectFolder.SelectedPath).GetFiles()
                // Only keep those who don't contain a zero in file name
                .Where(f=>!f.Name.Contains("0"));
            int i = 1;
            foreach (var file in Files)
            {
                //String filename = Path.GetFileNameWithoutExtension((path1));
    
                // Don't need a StreamReader not a using block, just read the whole file at once with File.ReadAllText
                //using (StreamReader sr = new StreamReader(path1))
                //{
                    //txt = sr.ReadToEnd();
    
                    var txt = File.ReadAllText(file.FullName);
                    XmlElement id = doc.CreateElement("Page.id");
                    id.SetAttribute("Page.Nr", i.ToString());
                    id.SetAttribute("Pagetitle", file.FullName);
                    XmlElement name = doc.CreateElement("PageContent");
                    XmlCDataSection cdata = doc.CreateCDataSection(txt);
                    name.AppendChild(cdata);
                    id.AppendChild(name);  // page id appenndchild         
                    root.AppendChild(id);  // roots appenedchild
                    doc.AppendChild(root); //Main root
                //}
                i++;
            }
        }
        Console.WriteLine("finished");
        Console.ReadKey();
    
        doc.Save(Path.ChangeExtension(path, ".xml"));
    
    }
    

    我还建议不要使用您正在使用的 XML api,而是使用更新和更简单的 linq to XML 一个,因为这也将简化您的元素的创建,请参阅下面整个代码的非常简化的版本,因为我d 用 LINQ 和 XElements 编写的

    static void Main(string[] args)
    {
        FolderBrowserDialog SelectFolder = new FolderBrowserDialog();
        String path = @"C:\newpages";
    
        var root = new XElement("Pages");
    
        if (SelectFolder.ShowDialog() == DialogResult.OK)
        {
            var FilesXML = new DirectoryInfo(SelectFolder.SelectedPath).GetFiles()
                .Where(f => !f.Name.Contains("0"))
                // Note that the index is 0 based, if you want to start with 1 just replace index by index+1 in Page.Nr
                .Select((file, index) => 
                    new XElement("Page.id",
                        new XAttribute("Page.Nr",index),
                        new XAttribute("Pagetitle",file.FullName),
                        new XElement("PageContent",
                            new XCData(File.ReadAllText(file.FullName))
                        )));
            // Here we already have all your XML ready, just need to add it to the root
    
            root.Add(FilesXML);
        }
        Console.WriteLine("finished");
        Console.ReadKey();
    
        root.Save(Path.ChangeExtension(path, ".xml"));
    
    }
    

    【讨论】:

    • 写得很好,我一般编程经验不多,我马上试试这段代码,非常感谢
    【解决方案5】:

    你可以试试这个,但如果你改变创建备份文件名称的逻辑,我会建议你。它不应该依赖“0”作为其中的字符,而是应该在文件名中提到像“备份”这样的固定文本。

    static void Main(string[] args)
        {
            FolderBrowserDialog SelectFolder = new FolderBrowserDialog();
            String path = @"C:\newpages";
    
            XmlDocument doc = new XmlDocument();
            XmlElement root = doc.CreateElement("Pages");
    
            if (SelectFolder.ShowDialog() == DialogResult.OK)
            {
                var txt = string.Empty;
                string[] Files = Directory.GetFiles((SelectFolder.SelectedPath));
    
                int i = 1;
                foreach (string path1 in Files)
                {
                    String filename = Path.GetFileNameWithoutExtension((path1));
    
                    if (!filename.Contains(".0"))
                    {
                        using (StreamReader sr = new StreamReader(path1))
                        {
                            txt = sr.ReadToEnd();
                            XmlElement id = doc.CreateElement("Page.id");
                            id.SetAttribute("Page.Nr", i.ToString());
                            id.SetAttribute("Pagetitle",  filename);
                            XmlElement name = doc.CreateElement("PageContent");
                            XmlCDataSection cdata = doc.CreateCDataSection(txt);
                            name.AppendChild(cdata);
                            id.AppendChild(name);  // page id appenndchild         
                            root.AppendChild(id);  // roots appenedchild
                            doc.AppendChild(root); //Main root
    
                        }
    
                    }
    
    
                 i++;
                }
            }
            Console.WriteLine("finished");
            Console.ReadKey();
    
            doc.Save(Path.ChangeExtension(path, ".xml"));
    
        }
    

    【讨论】:

    • 你对更改备份文件的逻辑是完全正确的,事情是我从未制作过它们,它们是从网页自动制作的备份,现在我只需要实际数据和 6000 个文件我只想出了 1034 ,所以 1034 是实际页面,其他只是历史记录或备份文件
    • 很高兴知道它对您有所帮助。 :)
    • 我想我是唯一一个认为它应该是 0 和点 (.0) 而不是 0 的人,但得到了反对...:D
    • 哈哈,对不起,我试图给你投票,但我的代表仍低于 15 岁,这意味着公众不会看到,并且 .0 肯定是正确的答案,因为如果 0 则 1 2 3 将保留
    • 不用担心.. 谢谢.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多