C# C语言中的文件搜索#
我制定了以下代码:C# C语言中的文件搜索#,c#,C#,我制定了以下代码: string[] paths = GetFiles(dir).ToArray(); int numberOfFiles = paths.Length; int i = 0; while (i < numberOfFiles - 1) { scanfile(paths[i]); i++; } string[]path=GetFiles(dir).ToArray(); int numberOfFiles=path.Length; int i=0; whi
string[] paths = GetFiles(dir).ToArray();
int numberOfFiles = paths.Length;
int i = 0;
while (i < numberOfFiles - 1)
{
scanfile(paths[i]);
i++;
}
string[]path=GetFiles(dir).ToArray();
int numberOfFiles=path.Length;
int i=0;
while(i
对于GetFiles:
static IEnumerable<string> GetFiles(string path) {
Queue<string> queue = new Queue<string>();
queue.Enqueue(path);
while (queue.Count > 0)
{
path = queue.Dequeue();
try
{
foreach (string subDir in Directory.GetDirectories(path))
{
queue.Enqueue(subDir);
}
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
}
string[] files = null;
try
{
files = Directory.GetFiles(path);
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
}
if (files != null)
{
for (int i = 0; i < files.Length; i++)
{
yield return files[i];
}
}
}
}
public string scanfile(string path)
{
int offset = 0;
int length = 0;
byte[] buffer;
var variable1 = new StringBuilder();
FileInfo fi = new FileInfo(path);
length = (int)fi.Length;
using (var mmf1 = MemoryMappedFile.CreateFromFile(path,
FileMode.OpenOrCreate, null, offset + length))
{
// Create reader to MMF
using (var reader = mmf1.CreateViewAccessor(300,
4000, MemoryMappedFileAccess.Read))
{
// Read from MMF
buffer = new byte[4000];
reader.ReadArray<byte>(0, buffer, 0, 4000);
}
}
return variable1.ToString();
}
静态IEnumerable GetFiles(字符串路径){
队列=新队列();
queue.Enqueue(路径);
而(queue.Count>0)
{
path=queue.Dequeue();
尝试
{
foreach(Directory.GetDirectories(path)中的字符串subDir)
{
排队(subDir);
}
}
捕获(例外情况除外)
{
Console.Error.WriteLine(ex);
}
string[]files=null;
尝试
{
files=Directory.GetFiles(路径);
}
捕获(例外情况除外)
{
Console.Error.WriteLine(ex);
}
如果(文件!=null)
{
for(int i=0;i
注意:获取文件我也从堆栈溢出中获取了
但是,如果我对目录中的许多文件使用它,速度会非常慢,因为
首先计算目录中的文件
你能帮我优化这些代码吗 您应该使用foreach循环遍历GetFiles的结果,而不是将其作为数组获取,然后扫描单个文件。好的,让我们看看是否可以将其简化一点。让我们使用以下代码获取所有文件:
// Get list of files in the specific directory.
// ... Please change the first argument.
string[] files = Directory.GetFiles("{root path}",
"*.*",
SearchOption.AllDirectories);
请注意,AllDirectories
记录如下:
在搜索操作中包括当前目录及其所有子目录。此选项包括重新分析点,例如搜索中已安装的驱动器和符号链接
现在让我们使用一个简单的foreach
循环来完成它们:
foreach (var file in files)
{
// ... do something
}
这有什么不起作用的原因吗?只要看看。他们的示例还介绍了如何迭代所有*.txt文件并获取包含Microsoft的所有行
该示例还通过跳过此文件来处理未经授权的访问异常。该代码不仅“非常慢”-它将是无限的,因为您永远不会更改
i
或numeriofiles
的值。这表明这不是您真正的代码,这使您很难进一步诊断问题。此外,您似乎没有显示scanfile
或GetFiles
的功能,以及为什么需要将其放入数组中?我建议您回答:您使用的是.NET的哪个版本?你能给线程一个scanfile()方法吗?可能是从线程池中?但是如果我使用foreach循环,它会出现一个错误“访问路径被拒绝”,我已经使用foreach方法很多次了。它运行良好,速度非常快!您正在调用不需要的ToArray方法。此外,迭代器有一些优化,这将使它稍微快一点。“访问路径被拒绝”错误与foreach循环无关。请确保您对尝试删除的文件拥有完全权限access@micheal显示代码。。Pastebin?如何获得完全权限?它不适用于错误:“拒绝访问路径”?!首先,它不是递归的,第二件事是,拒绝访问错误是文件系统问题,而不是代码问题。您无法使用代码解析它。您必须更改文件系统权限,或者以适当的用户权限运行代码,以便它可以访问所有文件。好的。所以,这是一个错误,因为我的电脑?如果我在另一台计算机上运行它,它会工作吗?@MurtuzaKabul,我不确定你怎么能表明它不是递归的。。。你真的做过原型吗?你是说微软的文档是一个彻头彻尾的谎言吗?@Michael,围绕权限错误的问题是因为你无权访问它试图搜索的目录之一。它可能是一个子目录,因为我假设您可以访问根目录。