37

有没有办法通过 FSW 确定文件或目录是否已被删除?

4

4 回答 4

43

Here's a simplified and corrected version of fletcher's solution:

namespace Watcher
{
    class Program
    {
        private const string Directory = @"C:\Temp";
        private static FileSystemWatcher _fileWatcher;
        private static FileSystemWatcher _dirWatcher;

        static void Main(string[] args)
        {
             _fileWatcher = new FileSystemWatcher(Directory);
             _fileWatcher.IncludeSubdirectories = true;
             _fileWatcher.NotifyFilter = NotifyFilters.FileName;
             _fileWatcher.EnableRaisingEvents = true;
             _fileWatcher.Deleted += WatcherActivity;

            _dirWatcher = new FileSystemWatcher(Directory);
            _dirWatcher.IncludeSubdirectories = true;
            _dirWatcher.NotifyFilter = NotifyFilters.DirectoryName;
            _dirWatcher.EnableRaisingEvents = true;
            _dirWatcher.Deleted += WatcherActivity;

            Console.ReadLine();
        }

        static void WatcherActivity(object sender, FileSystemEventArgs e)
        {
            if(sender == _dirWatcher)
            {
                Console.WriteLine("Directory:{0}",e.FullPath);
            }
            else
            {
                Console.WriteLine("File:{0}",e.FullPath);
            }
        }
    }
}
于 2010-07-26T18:15:08.273 回答
1

只有在同一路径中可能存在同名的文件和目录时,您的问题才有意义。例如,如果您有不带扩展名的文件名或带扩展名的目录。

bool iSDirectory = Path.GetExtension(e.FullPath).Equals("");如果您的目录和文件遵循通常的约定,只需检查完整路径中是否存在扩展名(文件什么的。

如果您必须处理我在开头提到的非常规问题,您可以检查该位置是否存在目录或文件。如果两者都没有,您将它们视为两者都已被删除。如果其中一个确实存在,则将另一个视为已删除。

您的询问意味着您在某处保留了文件和目录的列表,因此,对照该列表,您可以做出有关处理的决定。

我认为这种方法比使用两个文件系统观察者来区分的解决方案要好。

于 2014-04-07T09:22:00.060 回答
1

我最初临时使用“路径”功能,但后来在不删除的情况下我通过 Directory.Exists 修复它。但是,这并不能解决删除案例

bool isDirectory = Path.GetExtension(e.FullPath) == string.Empty;


if (e.ChangeType != WatcherChangeTypes.Deleted)
{
    isDirectory = Directory.Exists(e.FullPath);
}
于 2014-03-26T02:53:12.533 回答
-1

您可以询问该FileSystemEventArgs.FullPath属性以判断它是目录还是文件。

if (Path.GetFileName(e.FullPath) == String.Empty) 
{
    //it's a directory.
}

检查它是文件还是目录。

于 2010-07-26T16:09:10.527 回答