如何检查文件夹的内容是否已更改

问题描述 投票:0回答:5

我需要一个程序来检查新文件夹/文件是否已添加到给定的选定文件夹中。 我需要在应用程序启动时运行此过程,因此此阶段的处理时间很重要。

我想我可以制作当前状态的日志,先前状态的日志,对它们进行排序和比较。

  1. 首先我需要知道是否还有其他方法。

  2. 其次,如果没有其他方法,找到两个文件路径列表之间差异的最佳方法是什么:结构和算法。

旧状态:

c:\firstfolder\a.doc
c:\firstfolder\b.doc
c:\firstfolder\secondFolder\a.doc
c:\firstfolder\secondFolder\b.doc

新状态:

c:\firstfolder\a.doc
c:\firstfolder\b.doc 
c:\firstfolder\secondFolder\a.doc 
c:\firstfolder\secondFolder\b.doc 
c:\firstfolder\secondFolder\c.doc

我正在寻找

c:\firstfolder\secondFolder\c.doc

c# algorithm file path diff
5个回答
5
投票

您可以使用 FileSystemWatcher 类,我认为它正在做您想要的事情。


1
投票

由于您的应用程序不是连续运行的,因此使用 FileSystemWatcher 对您来说似乎不是一个好的选择,但我确实想提及它,因为它可能会激发您的一些想法。

如果您有旧状态的列表并创建新状态的列表,您可以使用类似于此处概述的算法来比较两个列表,以确定自第一个列表创建以来的添加和删除。对所提供的链接的接受答案也有一个很好的解决方案,如果列表未排序,该解决方案效果很好。


1
投票

您可以保存最后状态的时间信息。然后您就可以将文件和文件夹的创建时间与此进行比较。下面的代码可能会给你一个想法:

foreach(FileInfo f in dir.GetFiles() {
   if(f.CreationTime > dtLastState ) {
         //do some interesting stuff
   }
} 

编辑:这不是一个完整的答案。您无法通过此代码获取已删除的文件。


0
投票

我认为最好的选择是递归目录并保存状态。像这样的东西:

public List<FileData> RecurseDirectory(string directory, int level, out int files, out int folders)
        {
            IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
            //long size = 0;
            files = 0;
            folders = 0;
            WIN32_FIND_DATA findData;
            List<FileData> list = new List<FileData>();

            IntPtr findHandle;

            // add global escape chars if not present.
            if (directory.StartsWith(@"\\?\"))
            {
                findHandle = FindFirstFile(directory + @"\*", out findData);
            }
            else
            {
                findHandle = FindFirstFile(@"\\?\" + directory + @"\*", out findData);
            }


            if (findHandle != INVALID_HANDLE_VALUE)
            {
                //if file exists:


                do
                {
                    if ((findData.dwFileAttributes & FileAttributes.Directory) != 0)
                    {
                        //if it's a directory:

                        if (findData.cFileName != "." && findData.cFileName != "..")
                        {
                            //increment folder counter.
                            folders++;

                            int subfiles, subfolders;
                            string subdirectory = directory + (directory.EndsWith(@"\") ? "" : @"\") +
                                findData.cFileName;
                            //Console.WriteLine("Dir:" + subdirectory);

                            //add it to list
                            String path = subdirectory;
                            FileData tempFileData = new FileData();
                            tempFileData.path = path;
                            tempFileData.fileProperties = findData;
                            list.Add(tempFileData);

                            //allows -1 to do complete search.
                            if (level != 0)
                            {
                                //recurse through to next subfolder
                                list.AddRange(RecurseDirectory(subdirectory, level - 1, out subfiles, out subfolders));

                                folders += subfolders;
                                files += subfiles;
                            }
                        }
                    }
                    else
                    {
                        // File
                        files++;
                        string subfile = directory + (directory.EndsWith(@"\") ? "" : @"\") +
                                findData.cFileName;
                        //Console.WriteLine("File:" + subfile);
                        //list.Add("File:" + subfile);
                        String path = subfile;
                        FileData t = new FileData();
                        t.path = path;
                        t.fileProperties = findData;
                        list.Add(t);

                        //size += (long)findData.nFileSizeLow + (long)findData.nFileSizeHigh * 4294967296L;
                    }
                }
                while (FindNextFile(findHandle, out findData));
                FindClose(findHandle);

            }

            return list;
        }

此后,您将获得州列表。如果列表中也有旧状态。立即比较列表。


0
投票

最近我也有和你一样的需求。我目前正在使用 QT 编写这样的程序。请参阅我在 Github 网站上的代码如何将树文件夹显示到 QT 树视图

© www.soinside.com 2019 - 2024. All rights reserved.