Python文件名中的冒号
众所周知,Windows 中的文件名不能包含冒号.但是,我遇到了一个问题,可以使用以下示例代码重现该问题:
As we all know, filenames in Windows can't contain colons. However, I ran into a problem, that can be reproduced with the following sample code:
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:\
中创建任何内容,需要管理员权限才能写入;但是,它确实在当前工作目录中创建了一个文件.
This script creates three files in the ./temp
directory: a
, b
(with 'foo') and word1
(empty). It also creates a file named file
in D:\
, which is removable storage. It doesn't create anything in C:\
, which requires administrator rights to write in; however, it does create a file in the current working directory.
我不明白三件事:
- 为什么没有抛出任何异常(对于其他禁止字符,我得到 IOError)?
- 为什么
word1
文件是空的? - 为什么要在当前工作目录中创建文件?
Windows NTFS 支持文件流".您基本上将数据附加到文件,在文件之外,并且无法正常查看.创建文件word1:word2"时,隐藏流word2"附加到word1".如果你把文件 word1 复制到另一台 NTFS 机器上,word2 数据会随你而来
Windows NTFS supports file "stream". You basically append data to a file, outside of the file, and can't be viewed normally. When you created the file "word1:word2", the hidden stream "word2" is attached to "word1". If you copied the file word1 to another NTFS machine, the word2 data would come with you
转到这里 http://technet.microsoft.com/en-us/sysinternals/bb897440.aspx 并下载流程序.运行它会告诉你 word2 是一个附加到 word1 的流
Go here http://technet.microsoft.com/en-us/sysinternals/bb897440.aspx and download the streams program. Running it will show you that word2 is a stream attached to word1
此页面还讨论了流:http://www.forensicfocus.com/dissecting-ntfs-hidden-streams
要真正轻松地证明这一点,您可以使用记事本,但需要使用 .txt 扩展名:
To really prove this easily, you can use Notepad but you need to use the .txt extension:
file=open('word1.txt:word2.txt','w')
file.write('Testing streams')
file.close()
现在,使用 cmd 程序,将目录更改为您创建文件的位置.输入以下内容:
Now, using the cmd program, change directories to where you created the files. Type the following:
c:\tmp> notepad word1.txt
您将看到一个空文件.现在,试试这个:
You will see an empty file. Now, try this:
c:\tmp> notepad word1.txt:word2.txt
您应该看到文本Testing streams
.