繁体   English   中英

FileSystemWatcher - 识别已删除文件夹中的文件

[英]FileSystemWatcher - Recognize files in deleted folder

我的FileSystemWatcher有另一个问题;)简单地说,我想做什么:

我想观看特定的文件夹,以便将文件的路径添加到List(Of String)并为每个新文件设置整数变量。

所以:

我创建文件“Test.png”,它会这样做:

(List) categoryFilesList.Add(e.FullPath)
(Integer-variable) counter += 1

嗯,这很好用。

现在,如果再次删除文件,它应该从列表中删除路径并再次设置整数变量。 ( - = 1)。

这也很好,但现在我有一个问题,我无法找到解决方案。 我将IncludeSubdirectories设置为true以扫描子目录中的文件。 在添加这个工作正常,但在删除它没有。

那是因为我不向列表添加文件夹,只添加文件。 所以,如果我删除一个文件夹,我无法知道它包含的内容和文件的数量,因为它已经消失了。

但我想知道,有多少文件以及它们的路径是从列表中再次删除它们并再次将整数变量设置为删除文件的数量。

我不管怎么说要改变它,但我不知道究竟是多少,如果这是一个好主意。 有更好的解决方案吗?

如果事情不清楚,那么我很抱歉,然后问。 我也接受C#-answers,VB.NET只是因为我的朋友想要的。

谢谢!

我担心这不可能做到,因为删除目录在系统中的工作方式。 目录被删除,但递归的文件只是目录的一部分。

在MSDN论坛上有很好的描述:

我观察桌面上垃圾桶的行为,您会看到每次删除文件夹时,您都可以在垃圾箱中看到该文件夹​​,但是您无法看到该删除文件夹中的元素。 查看这些元素的唯一方法是从垃圾箱中恢复文件夹。

我认为它与FSW类发生的情况相同。 当您删除监视目录中的文件夹时,您只有已删除文件夹的事件,因为该文件夹及其内容并未真正删除,而只是移动到废纸篓。 这就是为什么您从未收到所包含文件的已删除事件的原因,因为它们仍然在您的系统上的某个位置

根据SO上的这个问题 ,当文件夹移动到结构中时会出现同样的问题(问题还显示了移动问题的解决方法)。

删除问题的可能解决方法是提前浏览结构并将目录中的文件数量保存为树状结构,但它肯定会比这复杂得多。 它看起来像这样:

public class DirectoryFiles
{
    public int Count {get; set;}

    public string FullPath {get; set;}
    public List<DirectoryFiles> Subdirectories {get; set; }
}

private DirectoryFiles Initialize(string fullPath)
{
    if (Directory.Exists(fullPath))
    {
        var toReturn = new DirectoryFiles { Subdirectories = new List<DirectoryFiles>() };

        foreach (string directory in Directory.GetDirectories(fullPath))
        {
            toReturn.Subdirectories.Add(this.Initialize(directory));
        }

        toReturn.Count = toReturn.Subdirectories.Sum(x => x.Count) + Directory.GetFiles(fullPath).Count();
        return toReturn;
    }
    else
    {
        throw new DirectoryNotFoundException(String.Format("Directory {0} does not exist", fullPath));
    }
}

在你计算的班级里:

private int GetCountOfFiles(DirectoryFiles files, string fullPath)
{
    if (files.FullPath.Equals(fullPath, StringComparison.InvariantCultureIgnoreCase))
    {
        return files.Count;
    }
    foreach (var subdir in files.Subdirectories)
    {
        if (this.GetCountOfFiles(subdir, fullPath) != -1)
        {
            return subdir.Count;
        }
    }
    return -1;
}

这可能需要改进:

  • 权限 - 如果您无权访问文件,它将抛出异常,
  • 性能并不完美,在每个子文件或子目录删除时,您都需要重建整个结构。 也可以为此创建一些优化,但对于较小的子目录应该可以很好地工作。 如果您需要改进性能,我会留给您。 为此,请考虑将DirectoryFiles Parent添加到DirectoryFiles并重新计算目录。

我对类似问题的解决方案如下:确保将FileSystemWatcher配置为跟踪子文件夹。 一旦这样做,您应该在删除文件夹或文件时获得Delete事件。 在删除文件夹的情况下,只需遍历您的集合并删除包含该文件夹路径的所有项目。

例如:

int numRemoved = categoryFilesList.RemoveAll(
            delegate(String s)
            {
               return s.Contains(<DeletedDirectoryPath>);
            }
            );

这将删除列表中包含的任何项目。 然后,您可以使用numRemoved来维护文件计数。 或者,您可以简单地使用列表的计数,而不是通过列表上的Count属性维护您自己的数据副本。

此外,您应该确保处理重命名项目和目录的情况,以便您的文件名列表始终是最新的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM