Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从名称不包含0的目录中获取所有文件?_C#_Xml - Fatal编程技术网

C# 如何从名称不包含0的目录中获取所有文件?

C# 如何从名称不包含0的目录中获取所有文件?,c#,xml,C#,Xml,最近,我构建了一个小型转换器,将txt数据转换为特定结构的xml,我选择一个文件夹,程序循环遍历该文件夹中的所有文件,并以xml格式写入一个xml文档 在文件夹中,我有如下数据名称: Data.0001.txt Data.0002.txt Data.0003.txt Data.0004.txt Data.txt 等等 我只想要不包含零的文件,因为带零的文件只是其他文件的备份,我有6000多个文件,无法手动筛选 这是我目前的代码 static void Main(string[] args)

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

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

Data.0001.txt

Data.0002.txt

Data.0003.txt

Data.0004.txt

Data.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"));

    }
}

对于
文件
变量,任何帮助都是非常好的,您可以使用正则表达式过滤掉只包含字母的文件名

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

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

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"));

    }

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


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

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

在解决这个问题时,整个代码可以大大简化。您不需要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 api,因为这也将简化元素的创建,请参见下面的一个非常简化的整个代码版本,我将使用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"));

}

如果(!filename.Contains(“0”)
@AfnanAhmad是的,事实上我太绝望了,甚至没有想到它应该是“.0”,因为总有一个“.”,谢谢你的帮助不知道这么简单谢谢工作了,所有其他人都像我一样工作well@PassionateCoder很高兴它有帮助。我一开始尝试使用正则表达式,但对我来说不起作用,我会用你编写的代码再试一次。谢谢manNo问题。如果能解决您的问题,请向上投票或接受。我确实投票了,但似乎无法向上投票。对不起,我的声誉不足15个:D有点新,但这始终是理解这些常规表达的方式。没问题,@激情编码者!:)这篇文章写得很好,我一般没有太多编程经验,我会马上尝试这段代码,非常感谢你关于更改备份文件逻辑的想法是完全正确的,但我从来没有做过,它们是从网页自动生成的备份,现在我只需要实际数据和6000个文件,我只找到了1034个,所以1034个是实际页面,其他只是历史或备份文件很高兴知道这对您有所帮助。:)我想我是唯一一个认为应该是0加上点(.0)而不是只有0的人,但是得到了否决票…:Dhaha我很抱歉,我试图给你投票,但我还不到15个代表,这意味着公众不会看到。0肯定是正确的答案,因为如果0,那么1 2 3将不会有任何担忧。。谢谢……)
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"));

}