我正在尝试查找和替换文件,但是有一点问题。这些文件的结构类似于PAVS_13001_0_I.pts
. 数字13001_0
因版本而异。但是我需要替换具有字符串的文件PAVS_####_#_I.pts
请记住,有许多文件名称不同,例如PM_13001_0_I.pts
,build.13.0.1.4.ClientOutput.zip
等。至少有 15 个这样的文件。字符串应该匹配,但数字会改变。
如何替换数字值发生变化的文件?
我正在尝试查找和替换文件,但是有一点问题。这些文件的结构类似于PAVS_13001_0_I.pts
. 数字13001_0
因版本而异。但是我需要替换具有字符串的文件PAVS_####_#_I.pts
请记住,有许多文件名称不同,例如PM_13001_0_I.pts
,build.13.0.1.4.ClientOutput.zip
等。至少有 15 个这样的文件。字符串应该匹配,但数字会改变。
如何替换数字值发生变化的文件?
如果它们都在同一个目录中,您可以尝试枚举该目录中的文件并将名称与正则表达式进行比较,如下所示:
string[] prefixes = {"PAVS", "PM"};
foreach (string filePath in Directory.EnumerateFiles(directory)
{
foreach (string prefix in prefixes)
{
if (Regex.IsMatch(file, prefix + @"_\d+_\d+_I\.pts"))
{
//Move the file
}
}
}
干得好:
//appSettings section:
//<add key="filename-patterns" value="PAVS_*_*_I.pts;omg.*.zip"/>
string[] patterns = ConfigurationManager.AppSettings["filename-patterns"].Split(';');
string sourceDir = @"C:\from\";
string destinationDir = @"C:\to\";
foreach (string pattern in patterns)
{
IEnumerable<string> fileNames = Directory.EnumerateFiles(sourceDir, pattern, SearchOption.AllDirectories);
fileNames.ToList().ForEach(x => File.Move(x, x.Replace(sourceDir, destinationDir)));
}
请注意,您可以将最后一个参数更改为SearchOption.AllDirectories
并遍历所有树。但是,当移动到目标文件夹时,它将保留文件夹结构。
我有这些文件C:\from
:
PAVS_123_1_I.pts
PAVS_123_2_I.pts
whatever.txt
它工作正常。
更新:我修改了代码以使用多种模式。您可以将该列表保留在配置文件中,这样您就不必为每个新文件模式重新构建应用程序。
更新appSettings
:现在代码正在从当前配置文件中读取。只需记住添加对System.Configuration
.