我希望名为“aaa.xxx.iii”的文件夹按字母顺序排列在名为“aaa.yyy”的文件夹之前
它是按字母顺序排序的,只是按 ASCII 排序的!
ASCII 值:
a = 97
b = 98
i = 105
x = 120
y = 121
. = 46
因此:
aaa = 291
aaa.xxx = 697
aaa.yyy = 700
aaa.xxx.iii = 1,012
但是,他们的逻辑似乎有所不同。他们实际上通过文件名正则表达式拆分文件名(并且他们使用相同的逻辑来比较目录和文件名)。他们首先有效地与文件名进行比较,甚至在考虑使用以下正则表达式的扩展名之前:
const FileNameMatch = /^(.*?)(\.([^.]*))?$/;
然后它只会在返回0时考虑扩展,不大于或小于。
使用该正则表达式:在您的示例中,aaa.xxx、aaa 是文件名,.xxx 是“扩展名”。
aaa.yyy; aaa 是文件名,与aaa.xxx.iii 比较,你会发现.iii 是扩展名。因此,aaa.yyy,或不带 .yyy 扩展名的名称:aaa aaa.xxx 或 aaa.xxx.iii 带扩展名
这是他们的逻辑:
explorerViewer.ts
comparers.ts:
export function compareFileNamesNumeric(one: string | null, other: string | null): number {
const [oneName, oneExtension] = extractNameAndExtension(one, true);
const [otherName, otherExtension] = extractNameAndExtension(other, true);
const collatorNumeric = intlFileNameCollatorNumeric.value.collator;
const collatorNumericCaseInsensitive = intlFileNameCollatorNumericCaseInsenstive.value.collator;
let result;
// Check for name differences, comparing numbers numerically instead of alphabetically.
result = compareAndDisambiguateByLength(collatorNumeric, oneName, otherName);
if (result !== 0) {
return result;
}
// Check for case insensitive extension differences, comparing numbers numerically instead of alphabetically.
result = compareAndDisambiguateByLength(collatorNumericCaseInsensitive, oneExtension, otherExtension);
if (result !== 0) {
return result;
}
// Disambiguate the extension case if needed.
if (oneExtension !== otherExtension) {
return collatorNumeric.compare(oneExtension, otherExtension);
}
return 0;
}
看来,在大多数情况下,他们只是使用Intl.Collator 和基本名称值a < b 逻辑,当然还有一些变化。
它们似乎也通过长度来消除歧义,这意味着 foo1 和 foo01 被认为是相等的。 line 169
设置
您描述的设置仅影响“它们的显示方式”,以某种方式排序是的,但主要影响它们向用户显示的方式,而不是按照我的解释以编程方式对它们进行排序。
// 控制资源管理器中文件和文件夹的排序顺序。
// - 默认值:文件和文件夹按名称排序,按字母顺序排列。文件夹显示在文件之前。
// - 混合:文件和文件夹按名称排序,按字母顺序排列。文件与文件夹交织在一起。
// - filesFirst:文件和文件夹按名称排序,按字母顺序排列。文件显示在文件夹之前。
// - 类型:文件和文件夹按其扩展名按字母顺序排序。文件夹显示在文件之前。
// - 修改:文件和文件夹按最后修改日期降序排列。文件夹显示在文件之前。
“explorer.sortOrder”:“默认”,
因此,它更多的是文件/目录的演示设置,而不是名称本身。
如果您查看explorerViewer.ts 控制流,您会看到:
switch (sortOrder) {
case 'type':
if (statA.isDirectory && !statB.isDirectory) {
return -1;
}
if (statB.isDirectory && !statA.isDirectory) {
return 1;
}
if (statA.isDirectory && statB.isDirectory) {
return compareFileNamesNumeric(statA.name, statB.name);
}
break;
现在我们可以想象回到目录是如何使用相同的函数进行排序的;回复if (statA.isDirectory && statB.isDirectory)