線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2332
推到 Plurk!
推到 Facebook!

同目錄逐步讀取不同檔名長度的檔案

答題得分者是:Stallion
popsbt
一般會員


發表:5
回覆:2
積分:1
註冊:2004-05-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-07 14:11:20 IP:140.117.xxx.xxx 訂閱
各位先進好:
小弟目前有遇到一個問題.就是要在同目錄底下讀取全部的檔案.有試過FindFirst()與FindNext()這兩個函式.
可以全部讀取進來.不過因為我的資料夾裡面的檔案名稱長度不一樣長(例:IM1,IM2...IM10,IM11...IM100,IM101...IM125)
所以讀取進來之後順序會依檔名逐步讀取至最長長度之後才又跳回.有點類似遞迴.(例:IM1,IM10,IM100,IM101,IM102...IM109,IM11,IM110,IM111...IM119,IM12...IM125...IM13,IM14...IM19,IM2,IM20...)
所以請問各位先進這種情況要如何解決?不更改檔名長度為相同的情況下.
先感謝您熱心的回答.
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-07 15:16:40 IP:211.22.xxx.xxx 未訂閱
你使用API來搜尋檔案,而API是依照檔名的ASCII碼的字元值來搜尋排列!而你卻想依照檔案後的位數長短不一的「編號值」來依序搜尋排列!在這種需求下,如果不把檔名命名先正規化,我不曉得還有什麼辦法?
===================引 用 popsbt 文 章===================
各位先進好:
小弟目前有遇到一個問題.就是要在同目錄底下讀取全部的檔案.有試過FindFirst()與FindNext()這兩個函式.
可以全部讀取進來.不過因為我的資料夾裡面的檔案名稱長度不一樣長(例:IM1,IM2...IM10,IM11...IM100,IM101...IM125)
所以讀取進來之後順序會依檔名逐步讀取至最長長度之後才又跳回.有點類似遞迴.(例:IM1,IM10,IM100,IM101,IM102...IM109,IM11,IM110,IM111...IM119,IM12...IM125...IM13,IM14...IM19,IM2,IM20...)
所以請問各位先進這種情況要如何解決?不更改檔名長度為相同的情況下.
先感謝您熱心的回答.
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-07 20:23:02 IP:60.248.xxx.xxx 訂閱
你好,
直接用api可能沒辦法處理,不過偏門的方法應該有不少。我舉一個"黑箱"的方式你參考…
1/依序把讀進來的檔名字串做處理,如IM10,就把IM的部份去掉,留下10這個字串,然後把字串10轉成數值放入數值容器中(如 int array等)。
2/ 於是你就有一個存放所有檔名後面數值t的容器,這時候你可利用自己的排序法,或是用你所選的容器的排序法讓裡面的值排序一下。
3/ 用loop把值一個一個取出並轉成字串,如: 10 這個數值變成10字串,然後再自行在10字串前加入"IM"字串。
4/於是你就得到一個完整的檔名,然後再開始進行讀取。

以上是個概念,你應該可以加強或修改成你需要的。當然,應該還有不少好方法可以"黑箱作業"。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-07 21:18:06 IP:211.22.xxx.xxx 未訂閱
1.方法很聰明!可是有缺陷!
(1)如果目錄下檔案很多,經過這個方法光整理檔案就不知道要耗時多久?
(2)恐怕無法即時反映目錄內的檔案增減變化,就算可以,按照檔案收錄排序的方式,整個陣列清除與排序要隨時重作一次!
2.建議還是想辦法先將檔名正規化為宜,請參考~
===================引 用 aftcast 文 章===================
你好,
直接用api可能沒辦法處理,不過偏門的方法應該有不少。我舉一個"黑箱"的方式你參考…
1/依序把讀進來的檔名字串做處理,如IM10,就把IM的部份去掉,留下10這個字串,然後把字串10轉成數值放入數值容器中(如 int array等)。
2/ 於是你就有一個存放所有檔名後面數值t的容器,這時候你可利用自己的排序法,或是用你所選的容器的排序法讓裡面的值排序一下。
3/ 用loop把值一個一個取出並轉成字串,如: 10 這個數值變成10字串,然後再自行在10字串前加入"IM"字串。
4/於是你就得到一個完整的檔名,然後再開始進行讀取。

以上是個概念,你應該可以加強或修改成你需要的。當然,應該還有不少好方法可以"黑箱作業"。
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-07 23:12:30 IP:60.248.xxx.xxx 訂閱
stallion兄果然厲害,一眼就看出程式的弱處。
謝謝幫忙把所舉的例子的小缺點寫出來。
在舉例前就知道有那麼些小問題,而比較重要的是"即時性"的問題,但就看取捨了。
有些時候為了要防極少數的情形而付出數倍的資源是不合效益的。當然某些要極精準的系統就不得不注意。
正規化是好方法,是根本的解決辦法。但是若因某些原因而"不能"去改動原程式檔名時就沒辦法了。
至於程序處理上的時間問題,我想正規化檔名也要不少時間,還好的是目前的cpu等硬體的速度應該不會有太大的感受。

另外,正規化的過程中也是會有比較輕微一點的即時問題…
總之,我想還有不少的更好的方法、完美的方法。在這裡只能啟發性的提個"偏門"解決法,並不能代表是最後的答案囉!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-05-02 11:55:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!