none
要「按照資料夾」排好檔名順序要如何做呢? RRS feed

  • 問題

  • 不好意思,這個問題應該算是基本的演算法(觀念)之類的東西,實在不知道該在哪一板提出,由於小弟用的是VB,所以只好貼在這兒,若有不妥煩請告知,必定改善。

    問題有點不容易解釋,小弟直接用例子說明:
    首先 D: 裡面有以下檔案:

    01 D:\a.abc
    02 D:\JPEG-A.jpg
    03 D:\中文檔名.txt
    04 D:\abc\A.txt
    05 D:\abc\D\A.txt
    06 D:\新資料夾A\新文字文件.txt
    07 D:\新資料夾A\abc\z.txt
    08 D:\新資料夾A\abc\D\A.txt
    09 D:\新資料夾B\新點陣圖影像.bmp

    然後以 dir 方式搜尋之,將所有搜尋到的檔案的完整路徑字串記在一個陣列裡,之後做好如上列出的正確排序。

    但問題來了,我依照 字串 去做比較,排序出來的變這樣:

    01 D:\a.abc
    02 D:\abc\A.txt
    03 D:\abc\D\A.txt
    04 D:\JPEG-A.jpg
    05 D:\中文檔名.txt
    06 D:\新資料夾A\abc\D\A.txt
    07 D:\新資料夾A\abc\z.txt
    08 D:\新資料夾A\新文字文件.txt
    09 D:\新資料夾B\新點陣圖影像.bmp

    以上很明顯與所謂"正確"的排序是不一樣的,正確的話第 04~05 項應該要在第 01 項的後面,之後的第 07 項、第 08 項的位置也不正確。

    我嘗試過先按照 字串 排好,然後在按照 "\" 出現的次數排一遍,但也不對,結果變成這樣:

    01 D:\a.abc
    02 D:\JPEG-A.jpg
    03 D:\中文檔名.txt
    04 D:\abc\A.txt
    05 D:\新資料夾A\新文字文件.txt
    06 D:\新資料夾B\新點陣圖影像.bmp
    07 D:\abc\D\A.txt
    08 D:\新資料夾A\abc\z.txt
    09 D:\新資料夾A\abc\D\A.txt

    請問要如何做到依照資料夾的正確排序呢?要做比較的關建是什麼? 一直想不出頭緒.. @_@

    先謝過板上先進囉~ :)

    • 已編輯 嘉諦 2012年6月6日 上午 08:35 縮減例子數目
    2012年6月6日 上午 08:09

解答

  • 您好,如果要用Folder排序的話,就用folder來比看看吧!

    CompareFileFolder.vb

    Imports System.IO
    
    Public Class CompareFileFolder
        Implements IComparer
    
    
    
        Public Overridable Overloads Function Compare(ByVal file1 As Object, _
               ByVal file2 As Object) As Integer Implements IComparer.Compare
            'Convert file1 and file2 to FileInfo entries
            Dim f1 As FileInfo = New FileInfo(file1)
            Dim f2 As FileInfo = New FileInfo(file2)
    
            Return String.Compare(f1.DirectoryName, f2.DirectoryName)
        End Function
    End Class

    Form1.vb (ListBox3是我拉到畫面的ListBox)

    Dim myFiles As [String]() = {"D:\a.abc", "D:\a.abcdefg", "D:\JPEG.jpg", "D:\中文檔名.txt", "D:\abc\A.txt", "D:\abc\C.txt", "D:\abc\D\A.txt", "D:\abc\D\B.txt", "D:\abc\D\Z.txt", "D:\新資料夾A\新文字文件.txt", "D:\新資料夾A\abc\A.txt", "D:\新資料夾A\abc\C.txt", "D:\新資料夾A\abc\ZAC.txt", "D:\新資料夾A\abc\D\A.txt"}
    Array.Sort(myFiles, New CompareFileFolder())
    ListBox3.Items.Clear()
    For Each f As String In myFiles
    	ListBox3.Items.Add(f)
    Next


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 嘉諦 2012年6月6日 下午 02:26
    2012年6月6日 上午 09:10
  • 1. 遞迴呼叫搜尋子目錄

    2. 遞回呼叫前,目錄排目錄,檔案排檔案,排好後,目錄開始遞迴。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 嘉諦 2012年6月6日 下午 07:12
    2012年6月6日 下午 02:28

所有回覆

  • 您好,如果要用Folder排序的話,就用folder來比看看吧!

    CompareFileFolder.vb

    Imports System.IO
    
    Public Class CompareFileFolder
        Implements IComparer
    
    
    
        Public Overridable Overloads Function Compare(ByVal file1 As Object, _
               ByVal file2 As Object) As Integer Implements IComparer.Compare
            'Convert file1 and file2 to FileInfo entries
            Dim f1 As FileInfo = New FileInfo(file1)
            Dim f2 As FileInfo = New FileInfo(file2)
    
            Return String.Compare(f1.DirectoryName, f2.DirectoryName)
        End Function
    End Class

    Form1.vb (ListBox3是我拉到畫面的ListBox)

    Dim myFiles As [String]() = {"D:\a.abc", "D:\a.abcdefg", "D:\JPEG.jpg", "D:\中文檔名.txt", "D:\abc\A.txt", "D:\abc\C.txt", "D:\abc\D\A.txt", "D:\abc\D\B.txt", "D:\abc\D\Z.txt", "D:\新資料夾A\新文字文件.txt", "D:\新資料夾A\abc\A.txt", "D:\新資料夾A\abc\C.txt", "D:\新資料夾A\abc\ZAC.txt", "D:\新資料夾A\abc\D\A.txt"}
    Array.Sort(myFiles, New CompareFileFolder())
    ListBox3.Items.Clear()
    For Each f As String In myFiles
    	ListBox3.Items.Add(f)
    Next


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 嘉諦 2012年6月6日 下午 02:26
    2012年6月6日 上午 09:10
  • 1. 遞迴呼叫搜尋子目錄

    2. 遞回呼叫前,目錄排目錄,檔案排檔案,排好後,目錄開始遞迴。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    • 已標示為解答 嘉諦 2012年6月6日 下午 07:12
    2012年6月6日 下午 02:28
  • 您好,如果要用Folder排序的話,就用folder來比看看吧!

    CompareFileFolder.vb

    Imports System.IO
    
    Public Class CompareFileFolder
        Implements IComparer
    
    
    
        Public Overridable Overloads Function Compare(ByVal file1 As Object, _
               ByVal file2 As Object) As Integer Implements IComparer.Compare
            'Convert file1 and file2 to FileInfo entries
            Dim f1 As FileInfo = New FileInfo(file1)
            Dim f2 As FileInfo = New FileInfo(file2)
    
            Return String.Compare(f1.DirectoryName, f2.DirectoryName)
        End Function
    End Class

    Form1.vb (ListBox3是我拉到畫面的ListBox)

    Dim myFiles As [String]() = {"D:\a.abc", "D:\a.abcdefg", "D:\JPEG.jpg", "D:\中文檔名.txt", "D:\abc\A.txt", "D:\abc\C.txt", "D:\abc\D\A.txt", "D:\abc\D\B.txt", "D:\abc\D\Z.txt", "D:\新資料夾A\新文字文件.txt", "D:\新資料夾A\abc\A.txt", "D:\新資料夾A\abc\C.txt", "D:\新資料夾A\abc\ZAC.txt", "D:\新資料夾A\abc\D\A.txt"}
    Array.Sort(myFiles, New CompareFileFolder())
    ListBox3.Items.Clear()
    For Each f As String In myFiles
    	ListBox3.Items.Add(f)
    Next


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    對喔!!! 直接抓到資料夾為止來做比對就好了!! 我一直掉在思緒的死胡同裡沒想到~~~ 這問題困擾了我將近2禮拜了說~~

    太感謝亂馬客大大的提點了~~~ 謝謝!謝謝! ^___^

    2012年6月6日 下午 02:29
  • 1. 遞迴呼叫搜尋子目錄

    2. 遞回呼叫前,目錄排目錄,檔案排檔案,排好後,目錄開始遞迴。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    目前這支軟體現行的這一版,我就是用此方式,但現在在做新版的開發,新版本需要新增的功能其中一項就是,要可以讓使用者任意變更排序方式,例如使用者變成照日期排,之後又要變回照資料夾檔名排。 所以會需要一口氣對整個陣列做排序。

    還是很謝謝您的回覆唷~ ^_^


    • 已編輯 嘉諦 2012年6月6日 下午 07:14 修改詞句
    2012年6月6日 下午 07:11
  • 用檔案陣列儲存屬性即可。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年6月7日 下午 12:48