C# 带通配符过滤的绝对路径
我有一个字符串列表,其中包含一些文件,为了便于操作,应该忽略这些文件。因此,我很好奇如何处理这种情况,这其中有一个外卡 例如,我的字符串列表中可能的输入为:C# 带通配符过滤的绝对路径,c#,.net,wildcard,C#,.net,Wildcard,我有一个字符串列表,其中包含一些文件,为了便于操作,应该忽略这些文件。因此,我很好奇如何处理这种情况,这其中有一个外卡 例如,我的字符串列表中可能的输入为: C:\Windows\System32\bootres.dll C:\Windows\System32\*.dll 我认为第一个例子很容易处理,我可以做一个字符串等于检查(忽略大小写)来查看文件是否匹配。但是,我不确定如何确定给定文件是否与列表中的通配符表达式匹配 对我正在做的事情有一点了解。允许用户将文件复制到某个位置或从该位置复制文件
C:\Windows\System32\bootres.dll
C:\Windows\System32\*.dll
我认为第一个例子很容易处理,我可以做一个字符串等于检查(忽略大小写)来查看文件是否匹配。但是,我不确定如何确定给定文件是否与列表中的通配符表达式匹配
对我正在做的事情有一点了解。允许用户将文件复制到某个位置或从该位置复制文件,但是,如果该文件与我的字符串列表中的任何文件匹配,则我不希望允许复制
也许有更好的方法来处理这个问题
我要排除的文件是从配置文件中读入的,我会收到试图复制的路径的字符串值。似乎我已经掌握了完成任务所需的所有信息,这只是一个最佳方法的问题。您可以使用Directory.GetFiles()
并使用路径的文件名查看是否有匹配的文件:
string[] filters = ...
return filters.Any(f =>
Directory.GetFiles(Path.GetDirectoryName(f), Path.GetFileName(f)).Length > 0);
更新:我确实完全弄错了。您有一组包含通配符的文件筛选器,并且希望根据这些通配符检查用户输入。您可以使用以下提供的解决方案:
如果文件当前不存在怎么办?我认为,如果我能够始终假定排除的文件存在,这种方法就会奏效。@Tada,我认为这是关于处理文件的。我以为OP想过滤源文件。。。否则你是对的…你的问题在于比较,对吗?可能相关:这会阻止编写新文件,比如说“C:\Windows\System32\SomedLlyOudonHave.dll”对吗?@hometoast:对不起,不要听你的,请详细说明。这与Tada在Stefan的回答中的评论相同。这将阻止复制与筛选器匹配的源文件,但如果您试图排除目标,则不会。如果不进行漫游,这将仅阻止筛选File.Copy中的源文件,而不是目标文件。例如filter C:.dll,在您的示例中,似乎我可以File.Copy(“D:\mydir\my.dll”,“C:\”)@hometoos:也许我误读了OP的问题,但我将其视为两个过滤器:包括(按用户)、排除(按系统)和结果(问题所涉及的)。
// Configured filter:
string[] fileFilters = new []
{
@"C:\Windows\System32\bootres.dll",
@":\Windows\System32\*.dll"
}
// Construct corresponding regular expression. Note Regex.Escape!
RegexOptions options = RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase;
Regex[] patterns = fileFilters
.Select(f => new Regex("^" + Regex.Escape(f).Replace("\\*", ".*") + "$", options))
.ToArray();
// Match against user input:
string userInput = @"c:\foo\bar\boo.far";
if (patterns.Any(p => p.IsMatch(userInput)))
{
// user input matches one of configured filters
}
IEnumerable<string> userFiles = Directory.EnumerateFiles(path, userFilter);
// a combination of any files from any source, e.g.:
IEnumerable<string> yourFiles = Directory.EnumerateFiles(path, yourFilter);
// or new string[] { path1, path2, etc. };
IEnumerable<string> result = userFiles.Except(yourFiles);
string input = @"c:\path1\*.dll;d:\path2\file.ext";
var result = input.Split(";")
//.Select(path => path.Trim())
.Select(path => new
{
Path = Path.GetFullPath(path), // c:\path1
Filter = Path.GetFileName(path) // *.dll
})
.SelectMany(x => Directory.EnumerateFiles(x.Path, x.Filter));