재귀 적으로 디렉토리에서 파일 검색
모든 xml 파일 목록을 반환하는 디렉터리를 통해 파일을 재귀 적으로 검색하는 다음 코드가 있습니다. 루트 디렉토리의 xml 파일이 목록에 포함되지 않는다는 점을 제외하면 모두 잘 작동합니다.
나는 그것이하는 첫 번째 일은 루트에서 디렉토리를 가져온 다음 파일을 가져 와서 루트에서 GetFiles () 호출을 누락시키는 이유를 이해합니다. foreach 전에 GetFiles () 호출을 포함하려고 시도했지만 결과가 예상과 다릅니다.
public static ArrayList DirSearch(string sDir)
{
try
{
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d, "*.xml"))
{
string extension = Path.GetExtension(f);
if (extension != null && (extension.Equals(".xml")))
{
fileList.Add(f);
}
}
DirSearch(d);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return fileList;
}
내 디렉토리 구조는 다음과 같습니다.
RootDirectory
test1.0.xml
test1.1.xml
test1.2.xml
2ndLevDir
test2.0.xml
test2.1.xml
3rdLevDir
test3.0.xml
test3.1.xml
코드 반환 :
test2.0.xml
test2.1.xml
test3.0.xml
test3.1.xml
다음을 포함한 모든 파일을 반환하고 싶습니다.
test1.0.xml
test1.1.xml
test1.2.xml
재귀와는 잘 어울리지 않습니다. 어떤 포인터라도 대단히 감사하겠습니다.
하위 디렉터리 를 검색 하는 이 Directory.GetFiles 오버로드를 사용할 수 있습니다 . 예를 들면 다음과 같습니다.
string[] files = Directory.GetFiles(sDir, "*.xml", SearchOption.AllDirectories);
이와 같이 하나의 확장 만 검색 할 수 있지만 다음과 같이 사용할 수 있습니다.
var extensions = new List<string> { ".txt", ".xml" };
string[] files = Directory.GetFiles(sDir, "*.*", SearchOption.AllDirectories)
.Where(f => extensions.IndexOf(Path.GetExtension(f)) >= 0).ToArray();
필요한 확장자 (확장자에 대해 대소 문자를 구분하는 NB)를 가진 파일을 선택합니다.
어떤 경우에는 Directory.EnumerateFiles 메서드 를 사용하여 파일을 열거하는 것이 바람직 할 수 있습니다 .
foreach(string f in Directory.EnumerateFiles(sDir, "*.xml", SearchOption.AllDirectories))
{
// do something
}
적절한 액세스 권한이없는 계정에서 코드가 실행되는 경우 UnauthorizedAccessException과 같이 throw 될 수있는 예외에 대해서는 설명서를 참조하십시오.
이것은 모든 xml 파일을 재귀 적으로 반환합니다.
var allFiles = Directory.GetFiles(path, "*.xml", SearchOption.AllDirectories);
- http://msdn.microsoft.com/en-us/library/ms143316%28v=vs.100%29.aspx
- http://msdn.microsoft.com/en-us/library/ms143448.aspx#Y252
다음 방법을 시도하십시오.
public static IEnumerable<string> GetXMLFiles(string directory)
{
List<string> files = new List<string>();
try
{
files.AddRange(Directory.GetFiles(directory, "*.xml", SearchOption.AllDirectories));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return files;
}
하나를 사용하는 대신 세 개의 목록을 만들고 있습니다 (반환 값을 사용하지 않음 DirSearch(d)
). 목록을 매개 변수로 사용하여 상태를 저장할 수 있습니다.
static void Main(string[] args)
{
var list = new List<string>();
DirSearch(list, ".");
foreach (var file in list)
{
Console.WriteLine(file);
}
}
public static void DirSearch(List<string> files, string startDirectory)
{
try
{
foreach (string file in Directory.GetFiles(startDirectory, "*.*"))
{
string extension = Path.GetExtension(file);
if (extension != null)
{
files.Add(file);
}
}
foreach (string directory in Directory.GetDirectories(startDirectory))
{
DirSearch(files, directory);
}
}
catch (System.Exception e)
{
Console.WriteLine(e.Message);
}
}
디렉토리에 대한 루프 전후에 파일에 대한 루프가 있어야하지만 그 안에 중첩되지 않아야합니다.
foreach (string f in Directory.GetFiles(d, "*.xml"))
{
string extension = Path.GetExtension(f);
if (extension != null && (extension.Equals(".xml")))
{
fileList.Add(f);
}
}
foreach (string d in Directory.GetDirectories(sDir))
{
DirSearch(d);
}
다음과 같이 할 수 있습니다.
foreach (var file in Directory.GetFiles(MyFolder, "*.xml", SearchOption.AllDirectories))
{
// do something with this file
}
폴더에 대한 루프 외부로 파일에 대한 루프를 이동하려고합니다. 또한 메서드를 호출 할 때마다 파일 컬렉션을 포함하는 데이터 구조를 전달해야합니다. 이렇게하면 모든 파일이 단일 목록으로 이동합니다.
public static List<string> DirSearch(string sDir, List<string> files)
{
foreach (string f in Directory.GetFiles(sDir, "*.xml"))
{
string extension = Path.GetExtension(f);
if (extension != null && (extension.Equals(".xml")))
{
files.Add(f);
}
}
foreach (string d in Directory.GetDirectories(sDir))
{
DirSearch(d, files);
}
return files;
}
그럼 이렇게 부르세요.
List<string> files = DirSearch("c:\foo", new List<string>());
최신 정보:
나에게 잘 알려지지 않았지만 어쨌든 다른 답변을 읽을 때까지 이미 이것을 수행하는 내장 메커니즘이 있습니다. 코드가 작동하도록 수정해야하는 방법에 관심이 있으시면 제 답변을 남겨 드리겠습니다.
EnumerateFiles를 사용하여 중첩 된 디렉터리에있는 파일을 가져옵니다. AllDirectories를 사용하여 디렉터리를 반복합니다.
using System;
using System.IO;
class Program
{
static void Main()
{
// Call EnumerateFiles in a foreach-loop.
foreach (string file in Directory.EnumerateFiles(@"c:\files",
"*.xml",
SearchOption.AllDirectories))
{
// Display file path.
Console.WriteLine(file);
}
}
}
For file and directory search purpose I would want to offer use specialized multithreading .NET library that possess a wide search opportunities and works very fast.
All information about library you can find on GitHub: https://github.com/VladPVS/FastSearchLibrary
If you want to download it you can do it here: https://github.com/VladPVS/FastSearchLibrary/releases
If you have any questions please ask them.
It is one demonstrative example how you can use it:
class Searcher
{
private static object locker = new object();
private FileSearcher searcher;
List<FileInfo> files;
public Searcher()
{
files = new List<FileInfo>(); // create list that will contain search result
}
public void Startsearch()
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
// create tokenSource to get stop search process possibility
searcher = new FileSearcher(@"C:\", (f) =>
{
return Regex.IsMatch(f.Name, @".*[Dd]ragon.*.jpg$");
}, tokenSource); // give tokenSource in constructor
searcher.FilesFound += (sender, arg) => // subscribe on FilesFound event
{
lock (locker) // using a lock is obligatorily
{
arg.Files.ForEach((f) =>
{
files.Add(f); // add the next received file to the search results list
Console.WriteLine($"File location: {f.FullName}, \nCreation.Time: {f.CreationTime}");
});
if (files.Count >= 10) // one can choose any stopping condition
searcher.StopSearch();
}
};
searcher.SearchCompleted += (sender, arg) => // subscribe on SearchCompleted event
{
if (arg.IsCanceled) // check whether StopSearch() called
Console.WriteLine("Search stopped.");
else
Console.WriteLine("Search completed.");
Console.WriteLine($"Quantity of files: {files.Count}"); // show amount of finding files
};
searcher.StartSearchAsync();
// start search process as an asynchronous operation that doesn't block the called thread
}
}
참고URL : https://stackoverflow.com/questions/9830069/searching-for-file-in-directories-recursively
'Programing' 카테고리의 다른 글
Vim에서 HTML 태그 탐색 (0) | 2020.12.15 |
---|---|
먼저 또는 생성 (0) | 2020.12.14 |
컴파일 오류-zlib.h 누락 (0) | 2020.12.14 |
UITableView는 반투명 탐색 모음 아래에 있습니다. (0) | 2020.12.14 |
관련 객체가 존재하는지 장고 확인 오류 : RelatedObjectDoesNotExist (0) | 2020.12.14 |