我目前正在尝试编码一个简单的工具,以轮询某些文件在晚上指定的时间到达服务器上的某些文件,以确认它们已经到达并记录了所有丢失的文件。他们将坐在此文件夹中大约。40分钟,然后通过脚本自动移出(我无法控制此)。
我的问题是:
如何将部分匹配的文件名与表格(我想在文件名中匹配唯一标识符(NUMBER
和NUMBER2
)与用户可以通过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);
}
}
如何创建类以存储文件路径和文件名的数字部分。在这里,我加入了数字,因为它使比较变得容易。
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()
返回您要寻找的值的字符串数组(例如"80039611"
)。
您只需在每个文件名上使用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);
}
}