4

我想索引我所有的音乐文件并将它们存储在数据库中。我有这个函数,我从音乐驱动器的根目录开始调用它。

IE

start > ReadFiles(C:\music\);

ReadFiles(path){
   foreach(file)
      save to index;

   foreach(directory)
      ReadFiles(directory);
}

这很好用,但是在运行程序时,使用的内存量会不断增长,最后我的系统内存不足。

有没有人有更好的方法不需要 4GB 的 RAM 来完成这项任务?

最好的问候, Tys

4

5 回答 5

10

Alxandr 基于队列的解决方案应该可以正常工作。

如果您使用的是 .NET 4.0,您还可以利用新Directory.EnumerateFiles方法来延迟枚举文件,而无需将它们全部加载到内存中:

void ReadFiles(string path)
{
    IEnumerable<string> files =
        Directory.EnumerateFiles(
            path,
            "*",
            SearchOption.AllDirectories); // search recursively

    foreach(string file in files)
        SaveToIndex(file);
}
于 2010-11-21T21:16:48.517 回答
2

您是否检查了除根目录之外的每个目录中出现的.和条目?..

如果你不跳过这些,你将有一个无限循环。

于 2010-11-21T21:15:24.393 回答
1

您可以将其实现为队列。我认为(但我不确定)这会节省内存。至少它会释放你的堆栈。每当您找到一个文件夹时,您就将它添加到队列中,并且每当您找到一个文件时,您就阅读它。这可以防止递归。

像这样的东西:

Queue<string> dirs = new Queue<string>();
dirs.Enqueue("basedir");
while(dirs.Count > 0) {
    foreach(directory)
        dirs.Enqueue(directory);
    ReadFiles();
}
于 2010-11-21T21:10:45.917 回答
0

但请注意,如果您无权访问文件或路径太长或发生其他异常,则 EnumerateFiles() 将停止运行。这是我目前用来解决这些问题的方法:

public static List<string> getFiles(string path, List<string> files)
{
    IEnumerable<string> fileInfo = null;
    IEnumerable<string> folderInfo = null;
    try
    {
        fileInfo = Directory.EnumerateFiles(str);
    }
    catch
    {

    }
    if (fileInfo != null)
    {
        files.AddRange(fileInfo);
        //recurse through the subfolders
        fileInfo = Directory.EnumerateDirectories(str);
        foreach (string s in folderInfo)
        {
            try
            {
                getFiles(s, files);
            }
            catch
            {

            }
        }
    }
    return files;
}

示例使用:

List<string> files = new List<string>();
files = folder.getFiles(path, files);

我的解决方案基于此页面上的代码:http: //msdn.microsoft.com/en-us/library/vstudio/bb513869.aspx

更新:可以在http://social.msdn.microsoft.com/Forums/vstudio/en-US/ae61e5a6-97f9-4eaa-9f1a-856541c6dcce/directorygetfiles-gives-me-找到一种更快的递归获取文件的方法拒绝访问?forum=csharpgeneral。使用 Stack 对我来说是新的(我什至不知道它存在),但该方法似乎有效。至少它列出了我的 C 和 D 分区上的所有文件,没有错误。

于 2013-11-24T09:11:45.913 回答
0

它可能是连接文件夹,在进行递归时会导致无限循环,但我不确定,请自行检查并查看。链接:https ://docs.microsoft.com/en-us/windows-server/administration/windows-commands/mklink

于 2018-03-21T09:57:08.283 回答