使用 FileInfo 和 Linq 实现文件自动化

File Automation with FileInfo and Linq

尝试想出一种方法来使用递归或 linq 遍历目录树以获得具有以下形式的文件名:"C:\Program Files(x86)\Folder1\Folder2\TargetParentFolder\TargetFolder\TargetFolderName.ext"基本上文件名将与文件夹名称并具有已知类型的文件扩展名,并且将位于 TargetFolder 目录中。然后我想打开 "TargetFolderName.ext" 文件在该文件中找到一个特定的字符串(字符串将始终在文件中)修改字符串,保存并关闭文件将目录树移回 TargetParentFolder 获取下一个子文件夹并在下一个 TargetFolder 中重复对文件的修改。到目前为止,我所拥有的是:

    FolderBrowserDialog folderPicker = new FolderBrowserDialog();
        if (folderPicker.ShowDialog() == DialogResult.OK)
        {
            lsvAddons.Items.Clear();
            List<string> folders = new List<string>(Directory.EnumerateDirectories(folderPicker.SelectedPath));
            foreach (var folder in folders)
            {
                var folderName = Path.GetDirectoryName(Path.GetDirectoryName(folder));

                var file = Directory.GetFiles(folderName, "*.toc", SearchOption.AllDirectories)
                .FirstOrDefault();
                ListViewItem item = new ListViewItem(folderName);
                item.Tag = folder;

                lsvAddons.Items.Add(item);

            }



        }

理想情况下,不会有一个 ListView 控件,而是一个集合,该集合将保存文件夹和每个匹配的文件名,以便在集合被填充后进行迭代修改。想法?

我建议使用递归,如下所示:

    void WalkDirectoryTree(System.IO.DirectoryInfo root)
        {
            System.IO.FileInfo[] files = null;
            System.IO.DirectoryInfo[] subDirs = null;

            try
            {
                files = root.GetFiles("*.*");
            }               
            catch (UnauthorizedAccessException e)
            {                   
            }    
            catch (System.IO.DirectoryNotFoundException e)
            {

            }

            if (files != null)
            {
                foreach (System.IO.FileInfo file in files)
                {                        
                   if(file.Extension == ".ext"){
                        //open the file here, and make your modification
                    }
                }

                subDirs = root.GetDirectories();

                foreach (System.IO.DirectoryInfo dirInfo in subDirs)
                {
                    // Recursive call for each sub directory.
                    WalkDirectoryTree(dirInfo);
                }
            }            
        }

这将访问每个级别并检查文件,检查此 link 以获取 MSDN 中的完整示例: https://msdn.microsoft.com/en-us/library/bb513869.aspx