使用 system.io.filesysteminfo 来查找文件。

本文介绍了一种在Windows系统中快速搜索指定文件的方法,并提供了一个用C#编写的示例程序,该程序采用递归方式搜索指定目录下的文件。

如何快速搜索你想找到文件呢。大家知道Windows系统自带了搜索,很方便,下面介绍自己编写的也可以达到同样的效果。注意。有些文件的访问需要更高的权限。这里暂且去掉那些文件目录的搜索。不然会出现error:无权访问。我这里是搜索的test.txt文件。

源代码如下:

using System;

using System.Collections.Generic;

using System.Linq; using System.Text;

using System.Threading.Tasks;

using System.IO;//由于使用了filesysteminfo 所以必须包含它。

namespace ConsoleApplication140

{     class Program   

  {         static void Main(string[] args)       

  {             searchfile(@"d:\","test.txt");    

         Console.WriteLine("显示完毕");           

  Console.Read();         }       

  static void searchfile(string filepath,string filename)    //写了一个searchfile函数,采用了递归的方法。

     {                      DirectoryInfo   dir = new DirectoryInfo(filepath );    

         foreach (FileSystemInfo    m in dir.GetFileSystemInfos  ())     

        {                 //Console.WriteLine(m.FullName );          

       if(m is DirectoryInfo )              

   {                     if (m.FullName == "d:\\System Volume Information") return;  //这个文件是我磁盘D中,无权访问的。这里把它忽略掉。

                   searchfile(m.FullName,filename );                 }              

   else                 {                     if(m.Name ==filename )              

       {                         Console.WriteLine("找到了文件:{0}", m.FullName);          

           }              

   }         

    }           

        }     } }

转载于:https://www.cnblogs.com/fandong90/p/4158070.html

<think>好的,我现在要解决的问题是用户提供的C#代码中的逻辑错误。首先,我需要仔细阅读并理解这段代码的功能。代码的目标是递归获取指定路径下所有符合条件的文件,这些文件的扩展名需要在uploadFileType列表中。看起来用户在使用Substring方法获取文件扩展名时可能有问题,导致某些情况下无法正确识别扩展名,从而过滤文件不正确。 首先,分析代码中的扩展名获取部分。用户原来的代码是使用item.FullName.Substring(item.FullName.LastIndexOf('.')).这里可能存在一个问题:如果文件名中没有点号,LastIndexOf会返回-1,那么Substring就会抛出异常。例如,一个名为"file"没有扩展名的文件,执行Substring(-1)会导致ArgumentOutOfRangeException。此外,如果路径中有其他目录包含点号,比如"test.file.txt",LastIndexOf('.')会找到最后一个点,得到正确的".txt",但如果有类似"file.tar.gz"的情况,可能用户希望的是.gz作为扩展名,而这里确实会正确处理,所以这部分可能没问题,但需要确认需求。接下来,用户注释掉了使用System.IO.Path.GetExtension(item.FullName)的方法,而选择了手动处理。通常来说,Path.GetExtension方法更可靠,因为它会处理各种边缘情况,例如正确处理没有扩展名的文件,或者路径中有多个点的情况。例如,对于"file.txt",Path.GetExtension会返回".txt";对于"file", 返回空字符串;对于"file.test.txt", 返回".txt"。而使用LastIndexOf('.')的方法,当文件名中有多个点时,可能没有问题,但如果路径中有目录包含点,比如"/some.dir/file",Path.GetExtension会正确返回文件的扩展名,而item.FullName可能包含路径,这时候LastIndexOf会错误地找到路径中的点,导致扩展名获取错误。例如,如果item.FullName是"C:\test.dir\file",那么LastIndexOf('.')会找到路径中的.dir的点,导致Substring获取到".dir\file",这显然不正确。 所以问题出在这里:当文件所在的目录路径中包含点号时,使用item.FullName的LastIndexOf('.')会错误地定位到路径中的点,而不是文件名的扩展名部分。正确的方法应该是先获取文件名,再取扩展名。例如,item是FileInfo对象,应该用item.Name而不是FullName来获取扩展名,或者直接使用item.Extension属性,因为FileSystemInfo的Extension属性已经提供了扩展名部分。例如,对于FileInfo实例,item.Extension会直接返回扩展名,包括点号,比如".txt"。 所以,修改方法是将获取扩展名的代码改为使用item.Extension,或者使用Path.GetExtension(item.Name)。这样就能正确获取文件的扩展名,而不会受到路径中的点号影响。 此外,还需要考虑文件系统项的类型。在代码中,当item是DirectoryInfo时,会递归处理,但目录可能也有Extension属性,不过通常目录的Extension是空字符串。所以在判断时,是否需要排除目录?不过原代码中已经将目录进行递归处理,所以当item是目录时,不会进入else分支,所以没有问题。因此,在else分支中的item实际上是FileInfo,这时候item.Extension是正确的。 现在,检查原代码中的else部分:当item不是目录时,即它是文件,那么获取扩展名。原代码中使用了item.FullName,这会导致问题,应该改为item.Extension或者Path.GetExtension(item.FullName),或者item.Name的扩展名。 因此,正确的修改应该是将获取extension的代码替换为:string extension = System.IO.Path.GetExtension(item.FullName); 或者直接使用: string extension =item.Extension;因为item如果是FileInfo,Extension属性已经正确返回扩展名。 另外,检查uploadFileType的分隔方式,用户代码中uploadFileType变量被Split('|')处理,例如可能是类似".txt|.docx"这样的字符串。需要确保扩展名的大小写问题,比如用户是否可能上传大写扩展名,而系统是否区分大小写。例如,如果uploadFileType包含".txt",而文件的扩展名是".TXT",那么Contains检查会失败,因为字符串比较区分大小写。因此可能需要将extension转换为小写(或大写)后再比较,同时确保lstUploadFileType中的扩展名也是同样的大小写处理。例如,修改为: string extension =item.Extension.ToLower(); List<string> lstUploadFileType = uploadFileType.ToLower().Split('|').ToList(); 但原代码中uploadFileType变量可能已经是正确的大小写格式,需要根据具体情况调整。但通常,扩展名比较应该不区分大小写,所以最好统一转换为小写或大写。 总结需要修改的地方:1. 扩展名的获取方式错误,应使用item.Extension或Path.GetExtension()来正确获取文件的扩展名,而不是处理FullName。 2. 扩展名比较时可能存在的的大小写问题。因此,修改后的代码应调整获取extension的方式,并可能处理大小写。 例如,原代码中的: //string extension = System.IO.Path.GetExtension(item.FullName); string extension =item.FullName.Substring(item.FullName.LastIndexOf('.')); 改为: string extension =item.Extension;// 或者 Path.GetExtension(item.Name); 然后处理大小写: if (lstUploadFileType.Contains(extension.ToLower())) 或者,将lstUploadFileType中的扩展名统一转换为小写,同时extension也转换为小写。 现在,给出修改后的代码:将获取extension的部分改为使用item.Extension,并将比较部分转换为小写: string extension =item.Extension.ToLower(); List<string> lstUploadFileType = uploadFileType.ToLower().Split('|').ToList(); 但需要注意,uploadFileType可能本身包含大写,例如用户传入的是".TXT|.DOC",这时候ToLower()会导致不匹配。所以更好的做法是在Split之后,将每个元素转换为小写,并将extension也转换为小写: List<string>lstUploadFileType= uploadFileType.Split('|').Select(s => s.ToLower()).ToList(); string extension =item.Extension.ToLower(); 这样无论用户输入的扩展名是大写还是小写,都会统一转为小写进行比较,而文件的扩展名也转为小写,确保比较正确。 所以,修改后的代码部分如下: else{ string extension= item.Extension.ToLower();List<string> lstUploadFileType =uploadFileType.Split('|').Select(ext => ext.ToLower()).ToList(); if (lstUploadFileType.Contains(extension)){ lstFiles.Add(item.FullName);} } 另外,原来的代码中,uploadFileType可能是一个字符串变量,比如像"txt|doc",或者".txt|.doc"。需要确保Split后的列表中的扩展名包含点号,例如,如果uploadFileType是"txt|doc",那么比较的extension是".txt",这样就不会匹配。所以用户需要确保uploadFileType中的每个扩展名包含点号,或者代码处理这种情况。例如,如果用户希望允许"txt"或".txt",则需要在代码中自动添加点号。但根据原代码,用户使用的是item.FullName.Substring来获取带点号的扩展名,所以可能期望uploadFileType中的扩展名是带点号的,比如".txt|.doc"。因此,在修改后的代码中,继续使用带点号的扩展名比较。 综上,正确的修改是: 将获取extension的方式改为item.Extension,并转换为小写,同时将uploadFileType分割后的每个元素转换为小写,确保比较时不区分大小写。同时处理可能存在的路径中的点号导致错误的问题。</think>以下是修复后的C#代码,用于正确递归获取指定目录下符合扩展名要求的文件: ```csharp private List<string> GetLocalTestFiles(string path) { List<string> lstFiles = new List<string>(); try { DirectoryInfo folder = new DirectoryInfo(path); FileSystemInfo[] files = folder.GetFileSystemInfos(); foreach (var item in files) { if (item is DirectoryInfo) { var subFiles = GetLocalTestFiles(item.FullName); lstFiles.AddRange(subFiles); } else { string extension = item.Extension.ToLower(); List<string> lstUploadFileType = uploadFileType.ToLower() .Split('|') .Select(ext => ext.Trim().StartsWith(".") ? ext.Trim() : "." + ext.Trim()) .ToList(); if (lstUploadFileType.Contains(extension)) { lstFiles.Add(item.FullName); } } } } catch (Exception ex) { // 处理异常 Console.WriteLine($"Error: {ex.Message}"); } return lstFiles; } ``` **代码解释:** 1. 使用`item.Extension`替代手动截取,直接获取规范化的文件扩展名(包含点号) 2. 添加`ToLower()`使扩展名比较不区分大小写 3. 对`uploadFileType`进行处理: - 转换为小写 - 使用`Select`确保每个扩展名以点号开头 - 自动为没有点号的扩展名前缀添加点号(如"txt"转换为".txt") 4. 添加了异常处理块 5. 保持递归遍历子目录的结构 **改进点:** - 正确处理包含点号的目录路径 - 规范扩展名格式 - 增强类型判读的健壮性 - 更好的异常处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值