2014-09-10 20 views
6

Come tutti sappiamo, i nomi file in Windows non possono contenere due punti. Tuttavia, mi sono imbattuto in un problema, che può essere riprodotto con il seguente codice di esempio:Colon nomi di file 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') 

Questo script crea tre file nella directory ./temp: a, b (con 'pippo') e word1 (vuoto) . Crea anche un file denominato file in D:\, che è una memoria rimovibile. Non crea nulla in C:\, che richiede diritti di amministratore per scrivere; tuttavia, crea un file nella directory di lavoro corrente.

Non capisco tre cose:

  1. Perché non sono delle eccezioni generate (con altri caratteri non consentiti, ottengo IOError)?
  2. Perché il file word1 è vuoto?
  3. Perché un file viene creato nella directory di lavoro corrente?
+3

È piuttosto tangenziale al tuo punto (che è una buona domanda), ma per favore usa 'with' quando lavori con i file. Diffondi buone pratiche! – Veedrac

+0

''word1: word2'' memorizza nel flusso NTFS alternativo denominato'' word2''. Controllalo con 'dir/R word1'. – eryksun

+1

''c: file'' crea un file chiamato'' file'' nella directory di lavoro corrente sull'unità C :. – eryksun

risposta

8

Windows NTFS supporta il file "stream". In pratica, aggiungi dati a un file, al di fuori del file, e non può essere visualizzato normalmente. Quando hai creato il file "word1: word2", il flusso nascosto "word2" è associato a "word1". Se hai copiato il file word1 in un'altra macchina NTFS, i dati word2 verrebbero con te

Vai qui http://technet.microsoft.com/en-us/sysinternals/bb897440.aspx e scarica il programma di streaming. L'esecuzione vi mostrerà che parola2 è un flusso attaccato al Parola1

Questa pagina parla anche di corsi d'acqua: http://www.forensicfocus.com/dissecting-ntfs-hidden-streams

Per dimostrare davvero facilmente, è possibile utilizzare il Blocco note, ma è necessario utilizzare l'estensione .txt:

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

Ora, utilizzando il programma cmd, modificare le directory in cui sono stati creati i file. Digitare quanto segue:

c:\tmp> notepad word1.txt 

Verrà visualizzato un file vuoto. Ora, prova questo:

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

Dovresti vedere il testo Testing streams.

+0

Puoi anche leggere nel flusso nascosto con Python: 'con open ('word1.txt : word2.txt ') come f: print f.read() ' –