本文通过实际代码示例,简单对比 Linux 和 macOS 两个操作系统在读取目录文件时的行为差异。
背景
昨天将一个 Java 服务部署到云服务器后,发现本地可用的一个鉴权拦截器(JwtInterceptor)在云端失效了,排查怀疑是本地和远程文件加载顺序不同导致。这里做简单实验进行验证。
测试方案
- 创建两个特定的 .class 文件(
JwtInterceptorConfig.class
, WebMvcConfig.class
)
- 使用 os.listdir() 和 Path.iterdir() 两种方法
- 每种方法都测试5次,以观察顺序是否稳定
- 分别在 macOS 和 Linux 平台(CentOS)运行
测试代码
由于不论系统、语言,目录读取都是基于 POSIX 标准的 readdir() 系统调用,因此简单起见,这里使用 Python 语音。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
import os
from pathlib import Path
import time
def create_test_files():
# 创建测试目录
test_dir = Path("config_test")
if test_dir.exists():
for file in test_dir.iterdir():
file.unlink()
else:
test_dir.mkdir()
# 创建两个测试文件
files = ["JwtInterceptorConfig.class", "WebMvcConfig.class"]
for file in files:
(test_dir / file).touch()
time.sleep(0.1) # 稍微等待一下,确保时间戳不同
return test_dir
def test_directory_reading(directory):
print(f"\n当前操作系统: {os.name}")
print("\n=== os.listdir() 测试 ===")
for i in range(5): # 连续测试5次
files = os.listdir(directory)
print(f"第 {i+1} 次:", files)
print("\n=== Path.iterdir() 测试 ===")
for i in range(5): # 连续测试5次
files = [f.name for f in Path(directory).iterdir()]
print(f"第 {i+1} 次:", files)
def main():
test_dir = create_test_files()
test_directory_reading(test_dir)
# 清理测试文件
input("\n按回车键删除测试文件...")
for file in test_dir.iterdir():
file.unlink()
test_dir.rmdir()
if __name__ == "__main__":
main()
|
测试结果
macOS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
当前操作系统: posix
=== os.listdir() 测试 ===
第 1 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
第 2 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
第 3 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
第 4 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
第 5 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
=== Path.iterdir() 测试 ===
第 1 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
第 2 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
第 3 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
第 4 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
第 5 次: ['JwtInterceptorConfig.class', 'WebMvcConfig.class']
|
Linux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
当前操作系统: posix
=== os.listdir() 测试 ===
第 1 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
第 2 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
第 3 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
第 4 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
第 5 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
=== Path.iterdir() 测试 ===
第 1 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
第 2 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
第 3 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
第 4 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
第 5 次: ['WebMvcConfig.class', 'JwtInterceptorConfig.class']
|