首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过多个文件夹返回文件列表的最有效方法

通过多个文件夹返回文件列表的最有效方法
EN

Stack Overflow用户
提问于 2011-08-03 00:06:26
回答 5查看 1.5K关注 0票数 1

总而言之,我得到了以下代码,当符合某些条件时,它将从路径目录中获取所有文件,包括子目录。目前,我有两种方法;一种是获取所有文件并将它们添加到列表中,另一种是返回列表。我只是想知道这是最好的方法,还是将两者结合起来更有效?或者,我的代码可以重写以提高效率吗?对不起,我对这一切都是新手!

代码语言:javascript
复制
public class FileUtility
    {
        List<FileInfo> fileInfoList = new List<FileInfo>();

        public void ProcessDir(string sourceDir, String userName)
        {
            try
            {
                string userNameFirstLetter = userName.First().ToString();
                DirectoryInfo di = new DirectoryInfo(sourceDir);

                foreach (FileInfo fi in di.GetFiles())
                {
                    if (fi.Extension == ".xls" || fi.Extension == ".xlsx" || fi.Extension == ".pdf")
                    {
                        if (fi.Name.Contains(userName))
                        {
                            if (fi.Name.Contains("X"))
                            {
                                if(fi.Name.First().ToString().Equals(userNameFirstLetter))
                                {
                                    if (fi.Name.Split(Convert.ToChar("X"))[0].Equals(userName))
                                    {
                                        fileInfoList.Add(fi);
                                    }
                                }
                            }
                        }
                    }
                }

                // Recurse into subdirectories of this directory.
                string[] subdirEntries = Directory.GetDirectories(sourceDir);
                foreach (string subdir in subdirEntries)
                {
                    // Do not iterate through reparse points
                    if ((File.GetAttributes(subdir) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
                    {
                        ProcessDir(subdir, userName);
                    }
                }
            }
            catch (DirectoryNotFoundException exp)
            {
                throw new DirectoryNotFoundException("Directory not found " + exp.Message);
            }
            catch (IOException exp)
            {
                throw new IOException("The Process cannot access the file because it is in use by another process " + exp.Message);
            }
        }

        public List<FileInfo> GetFileInfoList()
        {
            return fileInfoList;
        }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-03 00:13:22

你可以这样做:

代码语言:javascript
复制
DirectoryInfo dir = new DirectoryInfo(@"C:\PathName");
IEnumerable<FileInfo> files = dir.GetFiles("*.*");

如果你使用的是C# 3.5或更高版本,那么你可以使用LINQ来过滤掉。类似于:

代码语言:javascript
复制
// Only use files with userName in the filename
files = files.Where(f => f.Name.Contains(userName));

或者将这两项结合起来:

代码语言:javascript
复制
DirectoryInfo dir = new DirectoryInfo(@"C:\PathName");
IEnumerable<FileInfo> files = dir.GetFiles("*.*").Where(f => f.Name.Contains(userName));
票数 2
EN

Stack Overflow用户

发布于 2011-08-03 00:13:42

你不需要递归。

代码语言:javascript
复制
string[] filePaths = Directory.GetFiles(@"c:\SomeDir\", "*.ext", SearchOption.AllDirectories);
票数 5
EN

Stack Overflow用户

发布于 2011-08-03 00:17:57

如果这是关于获取文件列表,请看Paul Alan Taylor的答案。

如果您想(稍微)了解一下递归:直接从ProcessDir方法返回文件列表。

使用您提供的代码,至少需要调用,并且容易出错。特别是如果类被重用的话。

我在你的代码中做了一些修改:

  1. fileInfoList是在ProcessDir
  2. 内部声明的,递归调用将结果添加到“当前”结果。

公共类FileUtility {

公用列表ProcessDir(string sourceDir,String userName) {列表fileInfoList =新列表();尝试{ string userNameFirstLetter = userName.First().ToString();DirectoryInfo di =新DirectoryInfo(sourceDir);foreach (FileInfo fi in di.GetFiles()) { if (fi.Extension == ".xls“|| fi.Extension == ".xlsx”|| fi.Extension == ".pdf") { if (fi.Name.Contains(userName)) { if (fi.Name.Contains("X")) { if(fi.Name.First().ToString().Equals(userNameFirstLetter)) { if (fi.Name.Split(Convert.ToChar("X")).Equals(userName)){ fileInfoList.Add(fi);} //递归到此目录的子目录。string[] subdirEntries = Directory.GetDirectories(sourceDir);foreach (subdirEntries中的字符串子目录){ //如果((File.GetAttributes(子目录)& FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint) {fileInfoList.AddRange(ProcessDir(子目录,userName));} catch (DirectoryNotFoundException exp) {抛出新的DirectoryNotFoundException(“未找到目录”+ exp.Message);} catch (IOException exp) {抛出新的IOException(“进程无法访问文件,因为它正被另一个进程使用”+ exp.Message);}返回fileInfoList;}

}

注意:您的代码可以得到改进,例如,通过使用“逻辑与”&&组合if语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6915049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档