759 字
4 分鐘
【閒聊】把「檔案列表與比對工具」丟上 GitHub

寫了一個自己要用的小工具——「檔案列表與比對工具」,作為作品集、丟上 GitHub 好了……不過這樣就必須要把很多地方改善了 www。

檔案列表與比對工具#

開發動機#

  最近和家人在整理家裡的檔案庫……,之前備份來、備份去,然後又改來改去,導致有些資料夾內大致相同、但哪裡有一點點不同。
  人工找感覺好麻煩,於是想說來寫個程式把那些不共通的部分抓出來吧。

目前做到哪了?#

  其實我是先開發了「列表」功能,本來想根據列出來的 txt 檔再做比對;但是後來做「比對」功能時,想說這樣反而要跑兩次 IO,不如在讀取資料夾內資訊時順便搞定。

  剛剛為了要丟上 GitHub,才開始開新專案(本來只是在自己的練習專案裡開個 package 寫),重新整理一下程式結構;想說「列表」功能乾脆等之後程式碼重構完再來整理好了,於是現在放上去的只有「比對」功能。

印象深刻的挑戰#

  • isDirectory()true、但是 listFiles() 的結果不是空陣列而是 null
    • 理論上,即使是空的資料夾,listFiles() 的回傳結果應該會是空陣列(length0)、而不會是 null
    • 發現是「$RECYCLE.BIN」這種系統資料夾……;好吧,記起來,要多做這種判斷。

接下來想做什麼?#

  都寫在 README.md 的「待開發」了。

  • 想搬去其他電腦用,所以還是得做介面、打包
  • 如果能的話,也想做給家人使用——那樣肯定是要做 GUI 了。
  • 把輸出邏輯交給另一個執行緒
    • 現在輸出成 txt 檔的實現方式是類似於把每一行東西放進一個 List 裡面,最後交給輸出 method 去跑 for-each
    • 後來想優化一些小地方,發現沒辦法即時寫入輸出檔……
      • 想在程式一開始運行時就把時間記錄下來,這樣才能知道這次比對共跑了多久
      • 如果有發生錯誤,像是無法讀取等等,也想寫進輸出檔、類似 log 的概念
    • 如何實現?
      • 問 ChatGPT、得知了 BlockingQueue 這個好東西,就像是 Message Queue 的概念
      • 實作還有分 ArrayBlockingQueueLinkedBlockingQueue
        • 不過不像 List 那樣、在增刪時會有時間複雜度的差距,在這裡都是 O(1)
          • ArrayBlockingQueue 以「Circular Array」實現,並有兩個索引指針分別指向頭尾兩端
          • LinkedBlockingQueue 以雙向鏈表實現,每個元素會包含上一個元素和下一個元素的指標;也有兩個索引指針分別指向頭尾兩端
        • 比較
          • ArrayBlockingQueue
            • 必須在宣告時固定大小,如果內容已滿、會導致 Producer 阻塞
          • LinkedBlockingQueue
            • 因為是鏈表、占用記憶體會較大一點點
            • 可以不固定大小,就不用怕 Producer 速度較快、被阻塞