Python中文件名中的冒号

时间:2014-09-10 20:17:23

标签: python windows filenames ioerror

众所周知,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目录中创建三个文件:ab(带有'foo')和word1(空)。它还在file中创建了一个名为D:\的文件,该文件是可移动存储。它不会在C:\中创建任何内容,这需要管理员权限才能写入;但是,它确实在当前工作目录中创建了一个文件。

我不明白三件事:

  1. 为什么没有抛出任何异常(使用其他禁用字符,我得到IOError)?
  2. 为什么word1文件为空?
  3. 为什么在当前工作目录中创建文件?

1 个答案:

答案 0 :(得分:9)

Windows NTFS支持文件" stream"。您基本上将数据附加到文件之外的文件中,并且无法正常查看。当您创建文件" word1:word2"时,隐藏的流" word2"附在" word1"。如果将文件word1复制到另一台NTFS机器,则word2数据将随身携带

转到此处http://technet.microsoft.com/en-us/sysinternals/bb897440.aspx并下载流程序。运行它会显示word2是附加到word1的流

此页面还讨论了流: http://www.forensicfocus.com/dissecting-ntfs-hidden-streams

要真正证明这一点,您可以使用记事本,但需要使用.txt扩展名:

 file=open('word1.txt:word2.txt','w')
 file.write('Testing streams')
 file.close()

现在,使用cmd程序,将目录更改为您创建文件的位置。输入以下内容:

 c:\tmp> notepad word1.txt

您将看到一个空文件。现在,试试这个:

 c:\tmp> notepad word1.txt:word2.txt

您应该看到文字Testing streams