2010-09-04 146 views
7

我需要一個檢查新文件夾/文件是否添加到給定選定文件夾的過程。 我需要這個程序在應用程序啓動時運行,所以在這個階段的處理時間很重要。如何檢查文件夾的內容是否已更改

我想我可以做一個當前狀態的日誌,以前的狀態日誌,排序和比較它們。

  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

+0

你需要知道* *是否有一個變化,即一個'boolean'結果,或變化是什麼,即一個'名單'? =) – Rob 2010-09-04 19:16:33

+0

需要列表 ...我設法做到這一點在以下方式創建一個xml文件的前一個和正確的狀態,並比較它使用「除外」作爲Timwi取得:http://stackoverflow.com/questions/3647958/find-the-delta-between-two-xelements-using-except-c ...它的工作原理,但它很慢 – Asaf 2010-09-09 11:55:17

回答

1

由於您的應用程序沒有連續運行,所以使用FileSystemWatcher對您來說似乎不是一個好選擇,但我確實想提及它,因爲它可能引發您的一些想法。

如果你有舊的國家的名單,並創建新的國家的列表,你可以使用一種算法像概括here到兩個列表比較,以確定增刪自創建的第一個列表中的一個。接受提供的鏈接的答案也有一個很好的解決方案,如果列表沒有排序,效果很好。

+0

HashSets看起來很有前途,但我對它們一無所知......會嘗試嘗試瞭解更多關於它們的信息。謝謝 – Asaf 2010-09-04 19:39:25

3

您可以使用FileSystemWatcher類,我認爲它正在做你正在做的事情。

+3

這隻適用於應用程序正在運行。它不會檢測到程序調用之間發生的變化。 – ChrisF 2010-09-04 19:21:19

+1

+1 @Cyber​​Dude:謝謝,很高興知道這個監聽器存在(它讓我想知道我是否也需要它),但是ChrisF說它只是在運行時捕獲更改,而且我需要知道自從以前運行的應用程序 – Asaf 2010-09-04 19:36:02

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

不需要所有的遞歸,Directory.GetDirectories和Framework 4.0中的Directory.EnumerateDirectories都可以在一次調用中遍歷整個樹。更不用說上面的代碼還需要額外的P/Invoke聲明,這些聲明都沒有顯示。 – 2010-09-04 19:29:45

0

您可以保存最後狀態的時間信息。然後你可以比較文件和文件夾的創建時間。下面的代碼可能會給你一個想法:

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

編輯:這不是一個完整的答案。您無法通過此代碼獲取已刪除的文件。

2

我認爲Sync Framework可能是您正在尋找的。

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

+0

我需要比較具有相同子文件夾的兩個文件夾,但這些文件僅與名稱相同......它們是分開創建的,因此它們的內容,大小和其他參數不等於源文件夾。這就是我認爲你的解決方案這次不適合我的原因。謝謝阿薩夫 – Asaf 2010-09-05 15:14:09

相關問題