가능한 중복 :
Detecting moved files using FileSystemWatcher은 FileSystemWatcher는 이동 된 파일
난은 FileSystemWatcher로 이동 된 파일을 모니터하기 위해 노력하고, 여기에 방법에 대한 도움 가지고있어 :
을Using FileSystemWatcher with multiple files
그러나 나는 abl 이어야만한다는 것을 알았습니다. e Deleted 및 Created 이벤트를 사용하여 파일이 이동 된 위치의 경로와 이동 된 위치의 경로를 가져옵니다. 그러나 Delete 이벤트에 대해 비슷한 코드를 추가하면 하나 또는 다른 이벤트 만 트리거 할 수 있습니다. 그리고 그것은 어떤 이벤트가 실행될지를 결정하는 이벤트를 연결하는 순서와 같은 것으로 보입니다. 따라서 Created 이벤트를 배선 코드에 마지막으로 넣으면 실행됩니다. 그 반대의 경우에도 삭제 배선을 마지막에 실행하면 실행되지만 생성되지는 않습니다. 여기
코드입니다 :public class FileListEventArgs : EventArgs
{
public List<string> FileList { get; set; }
}
public class Monitor
{
private List<string> filePaths;
private List<string> deletedFilePaths;
private ReaderWriterLockSlim rwlock;
private Timer processTimer;
private Timer deletionTimer;
public event EventHandler FileListCreated;
public event EventHandler FileListDeleted;
public void OnFileListCreated(FileListEventArgs e)
{
if (FileListCreated != null)
FileListCreated(this, e);
}
public void OnFileListDeleted(FileListEventArgs e)
{
if (FileListDeleted != null)
FileListDeleted(this, e);
}
public Monitor(string path)
{
filePaths = new List<string>();
deletedFilePaths = new List<string>();
rwlock = new ReaderWriterLockSlim();
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Filter = "*.*";
watcher.Deleted += new FileSystemEventHandler(watcher_Deleted);
watcher.Created += watcher_FileCreated;
watcher.Path = path;
watcher.IncludeSubdirectories = true;
watcher.EnableRaisingEvents = true;
}
private void ProcessQueue()
{
try
{
Console.WriteLine("Processing queue, " + filePaths.Count + " files created:");
rwlock.EnterReadLock();
}
finally
{
if (processTimer != null)
{
processTimer.Stop();
processTimer.Dispose();
processTimer = null;
OnFileListCreated(new FileListEventArgs { FileList = filePaths });
filePaths.Clear();
}
rwlock.ExitReadLock();
}
}
private void ProcessDeletionQueue()
{
try
{
Console.WriteLine("Processing queue, " + deletedFilePaths.Count + " files created:");
rwlock.EnterReadLock();
}
finally
{
if (processTimer != null)
{
processTimer.Stop();
processTimer.Dispose();
processTimer = null;
OnFileListDeleted(new FileListEventArgs { FileList = deletedFilePaths });
deletedFilePaths.Clear();
}
rwlock.ExitReadLock();
}
}
void watcher_FileCreated(object sender, FileSystemEventArgs e)
{
try
{
rwlock.EnterWriteLock();
filePaths.Add(e.FullPath);
if (processTimer == null)
{
// First file, start timer.
processTimer = new Timer(2000);
processTimer.Elapsed += (o, ee) => ProcessQueue();
processTimer.Start();
}
else
{
// Subsequent file, reset timer.
processTimer.Stop();
processTimer.Start();
}
}
finally
{
rwlock.ExitWriteLock();
}
}
void watcher_Deleted(object sender, FileSystemEventArgs e)
{
try
{
rwlock.EnterWriteLock();
deletedFilePaths.Add(e.FullPath);
if (deletionTimer == null)
{
// First file, start timer.
deletionTimer = new Timer(2000);
deletionTimer.Elapsed += (o, ee) => ProcessDeletionQueue();
deletionTimer.Start();
}
else
{
// Subsequent file, reset timer.
deletionTimer.Stop();
deletionTimer.Start();
}
}
finally
{
rwlock.ExitWriteLock();
}
}
그래서 어떻게이 파일이 있던 원래 경로뿐만 아니라 그들이 이동 한 곳으로 새 경로를 얻을해야합니까? (모든 파일이 다중 파일 이동으로 이동 될 때까지 이벤트 처리를 보류하기 위해 타이머 코드가있는 이유에 대한 첫 번째 질문을 참조하십시오.
나는 그렇게 생각하지 않는다. 해당 게시물에서와 같이 파일 이름을 사용하여 파일을 비교하는 데 아무런 문제가 없습니다. 문제는 내가 삭제 및 트리거 이벤트를 만들 수 없다는 것입니다. 적어도 내가 보는 것은 create 이벤트가 트리거되고 삭제가 아직 완료되지 않았다는 것입니다. 필자의 메인 클래스에서는 생성 된 파일 목록을 가져와 삭제 된 파일 목록과 비교할 필요가 있지만 삭제 된 파일 목록은 비어 있으며 생성 된 파일 목록은 채워져 있어야합니다. – Anders