2014-09-10 16 views
6

Wie wir alle wissen, können Dateinamen in Windows keine Doppelpunkte enthalten. aber ich lief in ein Problem, das mit dem folgenden Beispielcode reproduziert werden kann:Doppelpunkt in Dateinamen in Python

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') 

Dieses Skript drei Dateien im ./temp Verzeichnis erstellt: a, b (mit ‚foo‘) und word1 (leer) . Es erstellt auch eine Datei mit dem Namen file in D:\, die Wechselspeicher ist. In C:\ wird nichts erstellt, für das Administratorrechte erforderlich sind. Es erstellt jedoch eine Datei im aktuellen Arbeitsverzeichnis.

Ich verstehe nicht, drei Dinge:

  1. Warum sind keine Ausnahmen geworfen (mit anderen Charakteren verboten, ich IOError bekommen)?
  2. Warum ist die word1 Datei leer?
  3. Warum wird eine Datei im aktuellen Arbeitsverzeichnis erstellt?
+3

Es ist eher tangential zu Ihrem Punkt (was eine gute Frage ist), aber bitte 'mit' verwenden, wenn Sie mit Dateien arbeiten. Verbreite gute Praktiken! – Veedrac

+0

''word1: word2'' speichert den alternativen NTFS-Stream namens' 'word2''. Überprüfen Sie dies mit 'dir/R word1'. – eryksun

+1

'c: file' erstellt eine Datei mit dem Namen' 'file'' im aktuellen Arbeitsverzeichnis auf Laufwerk C:. – eryksun

Antwort

8

Windows NTFS unterstützt Datei "Stream". Sie fügen Daten grundsätzlich an eine Datei außerhalb der Datei an und können nicht normal angezeigt werden. Wenn Sie die Datei "word1: word2" erstellt haben, wird der versteckte Stream "word2" an "word1" angehängt. Wenn Sie die Datei word1 auf einen anderen NTFS-Rechner kopierten, würden die word2-Daten mit Ihnen kommen.

Gehen Sie hier http://technet.microsoft.com/en-us/sysinternals/bb897440.aspx und laden Sie das Stream-Programm. Laufen sie zeigen Ihnen, dass word2 ist ein Stream

Diese Seite gibt es auch über Ströme spricht mit Wort1 angehängt: http://www.forensicfocus.com/dissecting-ntfs-hidden-streams

Um wirklich diese leicht zu beweisen, können Sie Notepad verwenden, aber Sie müssen die TXT-Erweiterung verwenden:

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

Wechseln Sie nun mit dem cmd-Programm in die Verzeichnisse, in denen Sie die Dateien erstellt haben. Geben Sie Folgendes ein:

c:\tmp> notepad word1.txt 

Sie sehen eine leere Datei. Nun versuchen Sie dies:

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

Sie sollten den Text Testing streams sehen.

+0

Sie können auch in den versteckten Stream mit Python lesen: 'mit open ('word1.txt : word2.txt ') als f: print f.read() ' –