【Windows 小知識】檔案總管的排序規則
首先,先讓 ChatGPT 幫我開場一下,我覺得他腦補得好像還不錯xD
ChatGPT 小故事時間
曾經好奇過,當我們在 Windows 檔案總管中觀察文件列表時,是什麼魔法使它們按照這樣一個特定的順序排列的嗎?嗯,這就是我要告訴你的故事:一個叫做 StrCmpLogicalW
的神秘 Windows API 的故事。
想像一下,有一天,Windows 開發者們圍坐在一起,思考著如何讓檔案總管的排序更符合用戶的直覺。你看,當用戶看到 “img10.jpg” 和 “img2.jpg” 這兩個文件時,他們自然會認為 “img2.jpg” 應該在 “img10.jpg” 之前,即使從字母順序上看,“10” 確實是在 “2” 之前。但是,人們不是機器,我們的大腦認為 2 小於 10。這就是 Windows 開發者們需要解決的問題。
於是,StrCmpLogicalW
這個 API 應運而生。
我是某一天在找我的樣本的時候才發現這個神祕的排序
因為樣本大多是用檔案的 hash 當作檔名,所以會長的像下面這樣
1 | 1c8bb52633d0861e2137a984048bd224 |
一般正常排序會用字典序(Lexicographic order),所以第一個字母排起來應該要是 0, 0, 1, 2, ...
照順序排,但我們看到上面的例子,在檔案總管裡面,他是排成 1, 4, 0, 7, ...
這個奇怪的順序,到底在排什麼,我一開始注意到就是各種問號,後來查一查才發現他是用 StrCmpLogicalW
這個神祕的 Windows API 去比較兩個字串,這篇有比較細節的去介紹其中的機制,比官方文件詳細。
StrCmpLogicalW
在比較的時候是用 meta-character 當做單位,meta-character 有分三種
.
- 數字
- 其他字元
這三大類之間的排序是 .
< 數字 < 其他字元,之後才是比較大類裡面的大小
重點就是這裡的數字是把整串的數字當作一個數值在比較
比如 29d0
就是把前面兩個數字當作 29
這個數值比較,所以 9f6f
< 29d0
(9
< 29
)
之所以要這樣排,應該跟 ChatGPT 介紹得差不多,為了讓一般使用者看起來更直覺,像是 img1.jpg
, img2.jpg
, …, img10.jpg
就會照 1, 2, 3, ...
的順序排了,就不會因為用字典序排,所以變成先 1, 10, 11, ...
1 開頭的排完才換 2 的 2, 20, 21, ...
,這種一般使用者比較不習慣的排法。
【Windows 小知識】檔案總管的排序規則