我目前正在创建一个文件扫描器,它根据特定标准枚举文件。扫描选项之一是排除大于预定义大小的文件。此规则可应用于单个目录及其子目录。
例如,用户可以指定一条规则以仅从 C:\Users{USERNAME}\Documents 获取小于 1GB 的文件。因此,如果用户决定扫描文档文件夹中的目录,可以说:C:\Users\{USERNAME}\Documents\SOMEDIR1\SOMEDIR2\
指定的规则应应用于该目录,并且仅应填充大小小于或等于 1GB 的文件。
目前,我将规则存储在字典中,该字典定义为Dictionary<string, long> dSizeLimit;
键是完整目录路径,值是规则的文件大小(以字节为单位)。
目前我正在使用以下方法来确定是否应从填充的文件列表中省略文件:
public void SearchDirectory(DirectoryInfo dir_info, List<string> file_list, ref long size, ScanOptions Opt = null)
{
if (Opt == null)
Opt = DefaultOption;
try
{
foreach (DirectoryInfo subdir_info in dir_info.GetDirectories())
{
SearchDirectory(subdir_info, file_list, ref size, Opt);
}
}
catch(Exception ex)
{
Console.WriteLine("Failed to enumerate directory: {0}", dir_info.FullName);
Console.WriteLine("Exception: {0}", ex.Message);
}
try
{
foreach (FileInfo file_info in dir_info.GetFiles())
{
//Here I iterate over all the size rules to determine if the current file should be added to the file_list
foreach (KeyValuePair<string,long> entry in Opt.dSizeLimit)
{
if(string.Compare(entry.Key, 0, file_info.FullName, 0, entry.Key.Length, true)==0)
{
if (entry.Value > 0 && file_info.Length > entry.Value)
continue;
}
}
file_list.Add(file_info.FullName);
size += file_info.Length;
}
}
catch(Exception ex)
{
Console.WriteLine("Failed to enumerate directory: {0}", dir_info.FullName);
Console.WriteLine("Exception: {0}", ex.Message);
}
}
ScanOptions 是一个包含所有扫描规则的结构,包括大小规则。从代码中可以看出,我目前遍历所有规则以确定当前文件是否应该包含在文件列表中。这可能是致命的,因为dSizeLimit
字典中的条目数量不受限制,因为用户可以添加他想要的任何规则。
那么有没有更好的方法来处理这种查找?
PS 请注意,我的目标框架应该是 .NET 2.0,所以 LINQ 和任何其他非 2.0 友好的命名空间都是不可能的。