none
請問如何取得被最後修改的資料夾 RRS feed

  • 問題

  • 請問各位前輩,如果想取得最後被修改的資料夾資料的話是否有容易方式可以做呢? 目前是使用 DirectoryInfo 和 Directory來做,但是似乎Directory.getdirectores()中的serach patten並沒有提供這之類的標準來取得檔案,因此我用了比較麻煩點的方法:

                string root_Path = @"../../../../TestResults";
                string[] filesName = Directory.GetDirectories(root_Path);
    
                DateTime dt = new DateTime();
                bool flag = true;
                DirectoryInfo dirInfo2 = null;
                foreach (string file in filesName)
                {
                    DirectoryInfo dirInfo = new DirectoryInfo(file);
    
                    if (flag)
                    {
                        dt = dirInfo.LastAccessTime;
                        flag = false;
                    }
    
                    if (dirInfo.LastAccessTime >= dt)
                    {
                        dt = dirInfo.LastAccessTime;
                        dirInfo2 = dirInfo;
                    }
                }
    

    想請教是否有更直接快速的方法可以達到相同效果呢?謝謝!


    請高手們給我一點指點吧 我一定會虛心受教的 ~"~
    2011年12月15日 上午 02:01

解答

  • LINQ 可以做,以下範例是將 D:\TEST 內的子資料夾,使用 LastAccessTime 做大到小排序

    您可以修改成取 Max 的 LastAccessTime

                var dirList = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                              select d).ToList().OrderByDescending(d=>d.LastAccessTime);
                foreach (var d in dirList)
                {
                    MessageBox.Show(d.Name + ":" + d.LastAccessTime);
                }
    


    歡迎參觀我的Blog.NET菜鳥自救會
    • 已提議為解答 亂馬客 2011年12月15日 上午 02:44
    • 已標示為解答 Ivy_coder 2011年12月15日 上午 05:46
    2011年12月15日 上午 02:38
    版主
  • 感謝您小歐:

    請問如果要僅取得最後修改的文件的話,是否可改成:

                var dirList = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                              select d).ToList().Where(d=>d.LastAccessTime);


    請高手們給我一點指點吧 我一定會虛心受教的 ~"~


    請試試這樣

        DirectoryInfo d = new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories().OrderByDescending(ccc => ccc.LastAccessTime).Take(1).Single();
     
    

     


    Shadowと愉快なコード達
    • 已提議為解答 亂馬客 2011年12月15日 上午 04:48
    • 已標示為解答 Ivy_coder 2011年12月15日 上午 05:46
    2011年12月15日 上午 04:07
  • 不用加Single()也可以哦!

    var dirList2 = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                               select d).ToList().OrderByDescending(d => d.LastAccessTime).Take(1);

    我比較愛用SingleOrDefault, ^_^

    var dirList3 = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                                select d).ToList().OrderByDescending(d => d.LastAccessTime).Take(1).SingleOrDefault();

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已編輯 亂馬客 2011年12月15日 上午 04:48
    • 已標示為解答 Ivy_coder 2011年12月15日 上午 05:46
    2011年12月15日 上午 04:47

所有回覆

  • LINQ 可以做,以下範例是將 D:\TEST 內的子資料夾,使用 LastAccessTime 做大到小排序

    您可以修改成取 Max 的 LastAccessTime

                var dirList = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                              select d).ToList().OrderByDescending(d=>d.LastAccessTime);
                foreach (var d in dirList)
                {
                    MessageBox.Show(d.Name + ":" + d.LastAccessTime);
                }
    


    歡迎參觀我的Blog.NET菜鳥自救會
    • 已提議為解答 亂馬客 2011年12月15日 上午 02:44
    • 已標示為解答 Ivy_coder 2011年12月15日 上午 05:46
    2011年12月15日 上午 02:38
    版主
  • 感謝您小歐:

    請問如果要僅取得最後修改的文件的話,是否可改成:

                var dirList = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                              select d).ToList().Where(d=>d.LastAccessTime);


    請高手們給我一點指點吧 我一定會虛心受教的 ~"~
    2011年12月15日 上午 02:53
  • 感謝您小歐:

    請問如果要僅取得最後修改的文件的話,是否可改成:

                var dirList = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                              select d).ToList().Where(d=>d.LastAccessTime);


    請高手們給我一點指點吧 我一定會虛心受教的 ~"~


    請試試這樣

        DirectoryInfo d = new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories().OrderByDescending(ccc => ccc.LastAccessTime).Take(1).Single();
     
    

     


    Shadowと愉快なコード達
    • 已提議為解答 亂馬客 2011年12月15日 上午 04:48
    • 已標示為解答 Ivy_coder 2011年12月15日 上午 05:46
    2011年12月15日 上午 04:07
  • 不用加Single()也可以哦!

    var dirList2 = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                               select d).ToList().OrderByDescending(d => d.LastAccessTime).Take(1);

    我比較愛用SingleOrDefault, ^_^

    var dirList3 = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                                select d).ToList().OrderByDescending(d => d.LastAccessTime).Take(1).SingleOrDefault();

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已編輯 亂馬客 2011年12月15日 上午 04:48
    • 已標示為解答 Ivy_coder 2011年12月15日 上午 05:46
    2011年12月15日 上午 04:47
  • 太棒了 謝謝各位的建議, 看來我也要好好學Linq!


    請高手們給我一點指點吧 我一定會虛心受教的 ~"~
    2011年12月15日 上午 05:46
  • 你只是要做目錄搜尋還是系統即時監控?

    [.Net] FileSystemWatcher


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年12月15日 下午 12:29
  • 前輩您好 我要做的是目錄搜尋
    請高手們給我一點指點吧 我一定會虛心受教的 ~"~
    2011年12月19日 上午 01:44
  • 不用加Single()也可以哦!

    var dirList2 = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                               select d).ToList().OrderByDescending(d => d.LastAccessTime).Take(1);

    我比較愛用SingleOrDefault, ^_^

    var dirList3 = (from d in new System.IO.DirectoryInfo(@"D:\TEST").GetDirectories()
                                select d).ToList().OrderByDescending(d => d.LastAccessTime).Take(1).SingleOrDefault();

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    為什麼不是直接用FirstOrDefault() ?

    http://msdn.microsoft.com/zh-tw/library/bb301896.aspx


    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年12月20日 上午 08:36
  •  var str = new System.IO.DirectoryInfo(@"D:\").GetDirectories()
                    .Select(t => new { Name = t.FullName, Time = t.LastAccessTime })
                    .Where(t => t.Time >= DateTime.Now);
    

    这样不行吗~~

    2011年12月28日 上午 03:47
  •  var str = new System.IO.DirectoryInfo(@"D:\").GetDirectories()
                    .Select(t => new { Name = t.FullName, Time = t.LastAccessTime })
                    .Where(t => t.Time >= DateTime.Now);
    

    这样不行吗~~

    您會取到可能0到多個目錄,且沒有按照時間排序的集合。

    所以前面幾位前輩的建議,都是要先OrderBy時間。


    若您的程式碼有SQL injection的問題,在修改完畢之前,我不願意給您任何解答。因為解決了您的程式問題,造成更大的系統漏洞問題,還不如讓程式壞掉。

    請參考:SQL injection簡介與解決方式

    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年12月28日 上午 03:56
  • 他的原意不是取得目录的最近修改时间吗?

    目录又不是只有一个文件夹,何来多个之说,

    取出0个也没有什么问题把?order by 有意义?


    • 已編輯 Leaf.wu 2011年12月28日 上午 05:08
    2011年12月28日 上午 05:08