Python中文件名中的冒号

Kri*_*fer 9 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')
Run Code Online (Sandbox Code Playgroud)

该脚本在./temp目录中创建三个文件:a,b(带'foo')和word1(空).它还会创建一个名为文件fileD:\,这是可移动存储.它不会创建任何内容C:\,这需要管理员权限才能写入; 但是,它确实在当前工作目录中创建了一个文件.

我不明白三件事:

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

cyb*_*oof 11

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()
Run Code Online (Sandbox Code Playgroud)

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

 c:\tmp> notepad word1.txt
Run Code Online (Sandbox Code Playgroud)

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

 c:\tmp> notepad word1.txt:word2.txt
Run Code Online (Sandbox Code Playgroud)

你应该看到文字Testing streams.