【问题标题】:File Automation with FileInfo and Linq使用 FileInfo 和 Linq 实现文件自动化
【发布时间】:2017-04-17 08:30:55
【问题描述】:

试图想出一种方法来使用递归或 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 控件,而是一个集合,该集合将保存文件夹和每个匹配的文件名,以便在填充集合后进行迭代修改。想法?

【问题讨论】:

    标签: c# linq fileinfo


    【解决方案1】:

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

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

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

    【讨论】:

    • 我会在 GetDirectories 周围添加异常句柄,这样当您无权访问文件夹时,代码将继续执行。
    • 效果出奇的好!谢谢!我对其进行了修改,以在父 foreach 循环和递归 foreach 循环上添加特定的异常处理,例如 IOException FileNotFoundException 等,并为每个捕获添加一个记录器以查看消息以使其更友好,然后调用 WalkDirectoryTree 从输入搜索模式和替换值后,表单上的按钮将文件中所需的字符串更改为新值。 (基本版本变更实现)
    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 2014-11-25
    • 1970-01-01
    • 2015-11-07
    • 2011-08-22
    • 1970-01-01
    • 2018-08-23
    • 2011-03-23
    相关资源
    最近更新 更多