특정 파일이 끝나는 새 파일을 만들려면 특정 디렉토리를 관찰해야합니다 (예 : .txt).새로 생성 된 파일의 디렉토리를 안정적으로 관찰하는 방법은 무엇입니까?
기본 운영 체제 (Windows/Linux) 또는 NFS 공유에 액세스하거나 Samba 공유 또는 로컬 디렉토리에 관계없이 작동해야합니다.
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate { HandleFile(e.FullPath); }));
문제는이 모든 파일을 선택하지 않는다는 것입니다 :
는 처음에는 단지은 FileSystemWatcher
WatcherForPathToWatch_Created의watcherForPathToWatch = new FileSystemWatcher(folderToWatch, "*.rdy");
watcherForPathToWatch.Created += WatcherForPathToWatch_Created;
watcherForPathToWatch.Error += WatcherForPathToWatch_Error;
watcherForPathToWatch.IncludeSubdirectories = false;
watcherForPathToWatch.EnableRaisingEvents = true;
내용을 사용했다. NTFS 파티션의 로컬 디렉토리에서도 파일이 처리되지 않는 경우가 있습니다.
그래서 그것에 대해 너무 많이 생각하지 않고 몇 분마다 DirectoryEnumeration을 수행하면 문제가 해결 될 것이라고 생각했습니다. 이 모양은 다음과 같습니다.
private void EnumerationBasedArchiving()
{
watcherForPathToWatch.EnableRaisingEvents = false;
int maxThreads;
int unneeded;
int currThreads;
do
{
Thread.Sleep(500);
ThreadPool.GetMaxThreads(out maxThreads, out unneeded);
ThreadPool.GetAvailableThreads(out currThreads, out unneeded);
} while ((maxThreads - currThreads) != 0);
List<string> listOfFilesToArchive = null;
do
{
try
{
Directory.EnumerateFiles(folderToWatch, "*.txt", SearchOption.TopDirectoryOnly).ToList();
}
catch (Exception ex)
{
//error logging happens here, too
Thread.Sleep(10000);
}
} while (listOfFilesToArchive == null);
watcherForPathToWatch.EnableRaisingEvents = true;
Parallel.ForEach(listOfFilesToArchive, (fileToArchive) => { HandleFiles(fileToArchive); });
}
이 접근법의 문제점은 대부분의 상황에서 작동해야하지만 너무 안정적이지 않습니다. 특히 디렉터리의 내용을 열거하고 처리기를 다시 전환하는 시점. 이 두 지점 사이에 정확히 만들어진 파일이있는 경우 다음 열거 사이클까지 처리하지 않겠습니다.
이제 '최상의'솔루션이 FileSystemWatcher를 완전히 무시할 수 있는지, 또는 어떻게하면 더 안정적으로 만들 수 있는지 궁금합니다. 생성 된 순서대로 파일을 처리하는 것이 중요합니다.
"특히 디렉토리 내용을 열거하고 핸들러를 다시 전환하는 시점 "- 처리기를 끄지 않고 코드의 중복 된 알림에 대처할 수 있습니까? – Rup
아마도. 그러나 FileSystemWatcher 항목을 버리는 것은 훨씬 쉽습니다. 왜 내가 전에 그것을 보지 못했는지 모르겠다./ –