Don't rush the spray first, please listen to my explanation.
It is true that the same functionality can be achieved using the GetFiles, GetDirectories, and GetFileSystemEntries methods under the existing directory classes, but believe that I am not an egg because these methods are met with "System Volume Information "This directory, it is very likely to give you a denial of access to the exception, want to skip all. So there is no way to re-implement a bit.
Implementation notes:
-is still implemented based on encapsulation of several methods of the Directory class, but not using their searchpattern and searchoption features
-Change the match pattern from Windows wildcard to regular match. One is to make the match more powerful, two is to achieve? * Matching has to do extra work, no need
The match mode does not add the ^$ by default, i.e. "ABC" will match all items that contain the string, so if you want to match the end and end, add your own ^$
Ignore case matching
If you do not want to search for the specified items but all, set the Regexpattern parameter to NULL instead of. *, the former performs better
-You can set the recurse and Throwex parameters to decide whether to search recursively, and whether to throw exceptions. Default is no recursion, no throw exception
-a directory that is inaccessible will be skipped. Of course, the premise is Throwex=false
-The reason for a layer of try-catch in the foreach shell is that if the specified dir is an inaccessible directory, it can also avoid exceptions
-The reason to get the item, get the file, get the directory to implement 3 methods, instead of implementing only one get item, the other two overloads, because only implement one, the logic of the foreach to do a lot of judgment, considering the method is recursive, so the less logic in the loop the better
-The reason why you do not check the validity of the Dir parameter is as above, the less judgment the better. So please make sure Dir is legal before you call
No nonsense, on the code:
/// <summary>///gets a match (file or directory) in the specified directory/// </summary>/// <param name= "dir" >directory to search for</param>/// <param name= "Regexpattern" >the item name pattern (regular). Null means ignore pattern match, return all items</param>/// <param name= "Recurse" >whether to search subdirectories</param>/// <param name= "Throwex" >whether to throw an exception</param>/// <returns></returns>Private Static string[] GetFileSystemEntries (stringDirstringRegexpattern =NULL,BOOLRecurse =false,BOOLThrowex =false) {List<string> LST =Newlist<string>(); Try { foreach(stringIteminchdirectory.getfilesystementries (dir)) { Try { if(Regexpattern = =NULL|| Regex.IsMatch (Path.getfilename (item), Regexpattern, Regexoptions.ignorecase |regexoptions.multiline)) {lst. ADD (item); } //Recursive if(Recurse && (File.getattributes (item) & fileattributes.directory) = =fileattributes.directory) {lst. AddRange (GetFileSystemEntries (item, Regexpattern,true)); } } Catch{if(Throwex) {Throw; } } } } Catch{if(Throwex) {Throw; } } returnlst. ToArray ();}/// <summary>///gets the matching file in the specified directory/// </summary>/// <param name= "dir" >directory to search for</param>/// <param name= "Regexpattern" >the file name pattern (regular). Null means ignore pattern match, return all files</param>/// <param name= "Recurse" >whether to search subdirectories</param>/// <param name= "Throwex" >whether to throw an exception</param>/// <returns></returns>Private Static string[] GetFiles (stringDirstringRegexpattern =NULL,BOOLRecurse =false,BOOLThrowex =false) {List<string> LST =Newlist<string>(); Try { foreach(stringIteminchdirectory.getfilesystementries (dir)) { Try { BOOLIsfile = (file.getattributes (item) & fileattributes.directory)! =fileattributes.directory; if(Isfile && (Regexpattern = =NULL|| Regex.IsMatch (Path.getfilename (item), Regexpattern, Regexoptions.ignorecase |regexoptions.multiline)) {lst. ADD (item); } //Recursive if(Recurse &&!isfile) {lst. AddRange (GetFiles (item, Regexpattern,true)); } } Catch{if(Throwex) {Throw; } } } } Catch{if(Throwex) {Throw; } } returnlst. ToArray ();}/// <summary>///gets the matching directory in the specified directory/// </summary>/// <param name= "dir" >directory to search for</param>/// <param name= "Regexpattern" >Directory name pattern (regular). Null means ignore pattern match, return all directories</param>/// <param name= "Recurse" >whether to search subdirectories</param>/// <param name= "Throwex" >whether to throw an exception</param>/// <returns></returns>Private Static string[] GetDirectories (stringDirstringRegexpattern =NULL,BOOLRecurse =false,BOOLThrowex =false) {List<string> LST =Newlist<string>(); Try { foreach(stringIteminchdirectory.getdirectories (dir)) { Try { if(Regexpattern = =NULL|| Regex.IsMatch (Path.getfilename (item), Regexpattern, Regexoptions.ignorecase |regexoptions.multiline)) {lst. ADD (item); } //Recursive if(recurse) {lst. AddRange (GetDirectories (item, Regexpattern,true)); } } Catch{if(Throwex) {Throw; } } } } Catch{if(Throwex) {Throw; } } returnlst. ToArray ();}
-Wenbi-
"C #" recursively searches for a specified item (file or directory) under a specified directory