Python文件名中的冒号
大家都知道,在Windows系统中,文件名是不能包含冒号的。不过,我遇到了一个问题,可以用下面的示例代码来复现:
import os
os.chdir('./temp')
names = ['a', 'b', 'word1: word2', 'c: file', 'd: file']
for name in names:
with open(name, 'w') as f:
f.write('foo')
这个脚本会在 ./temp
目录下创建三个文件:a
、b
(里面有'foo')和word1
(是空的)。它还会在 D:\
这个可移动存储设备上创建一个名为 file
的文件。它不会在 C:\
创建任何东西,因为那需要管理员权限才能写入;不过,它会在当前工作目录下创建一个文件。
我有三个不明白的地方:
- 为什么没有抛出任何异常(而其他不允许的字符会出现IOError)?
- 为什么
word1
文件是空的? - 为什么会在当前工作目录下创建一个文件?
1 个回答
13
Windows的NTFS文件系统支持一种叫做“流”的功能。简单来说,就是你可以在一个文件里添加一些数据,这些数据是隐藏的,平常看不到。当你创建一个名为“word1:word2”的文件时,隐藏的流“word2”就和“word1”绑定在一起。如果你把这个文件复制到另一个使用NTFS的电脑上,里面的“word2”数据也会一起带过去。
你可以去这个链接 http://technet.microsoft.com/en-us/sysinternals/bb897440.aspx 下载一个叫做streams的程序。运行这个程序后,你会看到“word2”是和“word1”绑定的流。
这个页面也讨论了流的相关内容:http://www.forensicfocus.com/dissecting-ntfs-hidden-streams
如果你想简单地证明这一点,可以用记事本,但要记得使用.txt这个扩展名:
file=open('word1.txt:word2.txt','w')
file.write('Testing streams')
file.close()
接下来,打开命令提示符,切换到你创建文件的目录。输入以下命令:
c:\tmp> notepad word1.txt
你会看到一个空文件。现在,试试这个:
c:\tmp> notepad word1.txt:word2.txt
你应该能看到文本 Testing streams
。