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

时间:2010-09-04 19:06:09

标签: c# algorithm file path diff

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

我想我可以记录当前状态,记录以前的状态,排序并比较它们。

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

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

  3. 旧州:

    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

5 个答案:

答案 0 :(得分:3)

你可以使用FileSystemWatcher课程,我认为它正是你所做的。

答案 1 :(得分:2)

我认为Sync Framework可能正是您所寻找的。

http://msdn.microsoft.com/en-us/sync/default.aspx

答案 2 :(得分:1)

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

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

答案 3 :(得分: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;
        }

在此之后,您将获得州名单。如果列表中也有旧状态。比较列表现在。

答案 4 :(得分:0)

您可以保存最后一个州的时间信息。然后你可以比较文件和文件夹的创建时间。以下代码可能会给您一个想法:

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

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