Как я могу проверить, было ли изменено содержимое папки? - PullRequest
7 голосов
/ 04 сентября 2010

Мне нужна процедура, которая проверяет, были ли новые папки / файлы добавлены в данную выбранную папку. Мне нужно, чтобы эта процедура запускалась при запуске приложения, поэтому время обработки на этом этапе важно.

Думаю, я могу сделать журнал текущего состояния, журнал предыдущего состояния, отсортировать и сравнить их.

  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.

Ответы [ 5 ]

3 голосов
/ 04 сентября 2010

Вы можете использовать FileSystemWatcher класс, я думаю, он делает именно то, что вы после.

2 голосов
/ 05 сентября 2010

Я думаю, что Sync Framework может быть тем, что вы ищете.

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

1 голос
/ 04 сентября 2010

Поскольку ваше приложение не работает непрерывно, использование FileSystemWatcher не кажется вам хорошим вариантом, но я хотел бы упомянуть об этом, поскольку оно может вызвать некоторые идеи на вашей стороне.

Если у вас есть список старого состояния и вы создали список нового состояния, вы можете использовать алгоритм, подобный приведенному выше здесь , чтобы сравнить два списка для определения дополнений. и удаления с момента создания первого списка. Этот принятый ответ на предоставленную ссылку также имеет хорошее решение, которое очень хорошо работает, если списки не отсортированы.

0 голосов
/ 05 сентября 2010

Вы можете сохранить информацию о времени последнего состояния.Тогда вы просто можете сравнить время создания файлов и папок с этим.Следующий код может дать вам представление:

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

Редактировать: Это не полный ответ.Вы не можете получить удаленные файлы по этому коду.

0 голосов
/ 04 сентября 2010

Я думаю, что лучшая ставка - это повторение по каталогу и сохранение состояния.Примерно так:

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;
        }

После этого у вас будет список штата.Если у вас есть старое состояние в списке также.Сравните списки сейчас.

...