使用 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
尝试想出一种方法来使用递归或 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