如何将文件名与 table 或列表中的部分匹配进行比较
How to compare filenames with partial match from a table or list
我目前正在尝试编写一个简单的工具来轮询在指定的夜间时间到达服务器的一些文件,以确认它们已经到达并记录所有丢失的文件。他们将在此文件夹中放置大约 1 分钟。 40分钟,然后通过脚本自动移出(我无法控制)。
我的问题是:
我如何比较部分匹配的文件名与 table(我想将文件名中的唯一标识符(下面的 NUMBER
和 NUMBER2
)与预定义 table,用户可以通过 Windows 表单更新)。大概我想拆分字符串,所以我拆分了 NUMBER
和 NUMBER2
这样我就可以比较它们并查看它们是否包含在文件名中( 两个 数字必须包含在文件名中才能匹配,并且顺序很重要)。
文件名格式:
NCR_XR_D_NUMBER_NUMBER2
由于顺序很重要,NCR_XR_D_8003_9611
不等于 NCR_XR_D_9611_8003
。
这是我现在拥有的:
public static void CheckIfFilesExist()
{
// Put all file names in XR File directory into array.
string[] array1 = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation);
//this location is stored as a app setting, type: string, scope: User. This is tested working OK.
// Print filenames into Console. (making sure the array is populating).
Console.WriteLine("--- Files:---");
foreach(string name in array1)
{
Console.WriteLine(name);
}
}
您只需在每个文件名上使用 Split
即可轻松解决此问题。类似于:
public static void CheckIfFilesExist()
{
string[] array1 = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation);
foreach(string name in array1)
{
Console.WriteLine(name);
if (Path.GetFileName(name).StartsWith("NCR"))
{
string[] splitted = name.Split('_');
int number1 = int.Parse(splitted[3]);
int number2 = int.Parse(splitted[4].Split('.')[0]);
}
Console.WriteLine(number1);
Console.WriteLine(number2);
}
}
如何创建一个 class 来存储文件路径和文件名的数字部分。在这里,我将数字连接在一起,这样比较容易。
public class FileInfo
{
public string FilePath { get; private set; }
public string Numbers { get; private set; }
public FileInfo(string filepath)
{
var fileName = Path.GetFileName(filepath);
if (!fileName.StartsWith("NCR"))
{
throw new ArgumentException("Wrong type of file.");
}
FilePath = filepath;
var nameParts = fileName.Split('_');
Numbers = nameParts[3] + nameParts[4];
}
}
那么你的函数就变成了:
public static void CheckIfFilesExist()
{
var filesToFilter = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation).Select(f => new FileInfo(f));
var filterValues = GetFilterValues();
var filteredFiles = filesToFilter.Where(f => filterValues.Contains(f.Numbers));
}
其中 GetFilterValues()
returns 您要查找的值的字符串数组(例如 "80039611"
)。
我目前正在尝试编写一个简单的工具来轮询在指定的夜间时间到达服务器的一些文件,以确认它们已经到达并记录所有丢失的文件。他们将在此文件夹中放置大约 1 分钟。 40分钟,然后通过脚本自动移出(我无法控制)。
我的问题是:
我如何比较部分匹配的文件名与 table(我想将文件名中的唯一标识符(下面的 NUMBER
和 NUMBER2
)与预定义 table,用户可以通过 Windows 表单更新)。大概我想拆分字符串,所以我拆分了 NUMBER
和 NUMBER2
这样我就可以比较它们并查看它们是否包含在文件名中( 两个 数字必须包含在文件名中才能匹配,并且顺序很重要)。
文件名格式:
NCR_XR_D_NUMBER_NUMBER2
由于顺序很重要,NCR_XR_D_8003_9611
不等于 NCR_XR_D_9611_8003
。
这是我现在拥有的:
public static void CheckIfFilesExist()
{
// Put all file names in XR File directory into array.
string[] array1 = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation);
//this location is stored as a app setting, type: string, scope: User. This is tested working OK.
// Print filenames into Console. (making sure the array is populating).
Console.WriteLine("--- Files:---");
foreach(string name in array1)
{
Console.WriteLine(name);
}
}
您只需在每个文件名上使用 Split
即可轻松解决此问题。类似于:
public static void CheckIfFilesExist()
{
string[] array1 = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation);
foreach(string name in array1)
{
Console.WriteLine(name);
if (Path.GetFileName(name).StartsWith("NCR"))
{
string[] splitted = name.Split('_');
int number1 = int.Parse(splitted[3]);
int number2 = int.Parse(splitted[4].Split('.')[0]);
}
Console.WriteLine(number1);
Console.WriteLine(number2);
}
}
如何创建一个 class 来存储文件路径和文件名的数字部分。在这里,我将数字连接在一起,这样比较容易。
public class FileInfo
{
public string FilePath { get; private set; }
public string Numbers { get; private set; }
public FileInfo(string filepath)
{
var fileName = Path.GetFileName(filepath);
if (!fileName.StartsWith("NCR"))
{
throw new ArgumentException("Wrong type of file.");
}
FilePath = filepath;
var nameParts = fileName.Split('_');
Numbers = nameParts[3] + nameParts[4];
}
}
那么你的函数就变成了:
public static void CheckIfFilesExist()
{
var filesToFilter = Directory.GetFiles(@Properties.Settings.Default.XRFolderSavedLocation).Select(f => new FileInfo(f));
var filterValues = GetFilterValues();
var filteredFiles = filesToFilter.Where(f => filterValues.Contains(f.Numbers));
}
其中 GetFilterValues()
returns 您要查找的值的字符串数组(例如 "80039611"
)。