2016-05-23 13 views
1

Ich programmiere ein kleines Skript, das jede Datei verschlüsselt, die sich nach einem bestimmten Pfad befindet. In meinem Fall die Skripte realpath ... im ersten Ordner (Skriptverzeichnis) funktioniert gut, aber wenn ich in das nächste Verzeichnis gehe, versucht es, in die Dateien in der zweiten Verzeichnisstufe zu cd. So sieht der Baum aus [Datei, Datei, Ordner [Datei, Datei], Datei, Datei]Dateien von jedem Verzeichnis holen (Py)

(Ich weiß, dass das Skript und der Schlüssel auch verschlüsselt werden, aber ich war zu faul dafür. .. und sorry für mein schlechtes Englisch, ich hoffe, dass Sie mich verstehen können: P)

Mein Code:

import os 
import Crypto 
from Crypto.PublicKey import RSA 

def cryptFilesInFolder(currentDir): 
    content_list = os.listdir(currentDir) 
    print content_list 
    print '[+] Start encrypting files in Dir: ' + currentDir 
    for filename in content_list: 
     print '[+] Encrypting ' + filename 
     crypt(filename, key, currentDir) 

def crypt(filename, key, currentDir): 
    try: 
     f = open(filename, 'r') 
     fileString = f.read() 
     f.close() 
     print '[+] Encrypting file: ' + filename + ' with 4096 bytes' 
     encryptedFileString = key.publickey().encrypt(fileString, 4096) 
     f = open (filename, 'w') 
     f.write(str(encryptedFileString)) #write ciphertext to file 
     f.close() 
    except IOError: 
     print '[!] File was a folder' 
     cryptFilesInFolder(currentDir + '/' + filename) 

print '[+] Startet Crypting' 
print '[+] Reading Key' 
f = open('mykey.pem','r') 
key = RSA.importKey(f.read()) 
f.close() 
print '[+] Key imported' 
print '[+] Setting Root Directory' 
rootDir = os.path.realpath(__file__) 
print 'Root Directory set' 
print '[+] Starting encryption in folder: ' 
cryptFilesInFolder(os.path.dirname(os.path.realpath(__file__))) 
print '[+] Finished \n\n\n' 

die Fehlermeldung:

Bjarne-2:crypt bjarne$ python crypt\ folder\ Kopie.py 
[+] Startet Crypting 
[+] Reading Key 
[+] Key imported 
[+] Setting Root Directory 
Root Directory set 
[+] Starting encryption in folder: 
['.DS_Store', 'crypt folder Kopie.py', 'myKey.pem', 'Neuer Ordner'] 
[+] Start encrypting files in Dir: /Users/bjarne/Desktop/crypt 
[+] Encrypting .DS_Store 
[+] Encrypting file: .DS_Store with 4096 bytes 
[+] Encrypting crypt folder Kopie.py 
[+] Encrypting file: crypt folder Kopie.py with 4096 bytes 
[+] Encrypting myKey.pem 
[+] Encrypting file: myKey.pem with 4096 bytes 
[+] Encrypting Neuer Ordner 
[!] File was a folder 
['.DS_Store', 'key Kopie.py'] 
[+] Start encrypting files in Dir: /Users/bjarne/Desktop/crypt/Neuer Ordner 
[+] Encrypting .DS_Store 
[+] Encrypting file: .DS_Store with 4096 bytes 
[+] Encrypting key Kopie.py 
[!] File was a folder 
Traceback (most recent call last): 
    File "crypt folder Kopie.py", line 37, in <module> 

    File "crypt folder Kopie.py", line 11, in cryptFilesInFolder 

    File "crypt folder Kopie.py", line 25, in crypt 

    File "crypt folder Kopie.py", line 11, in cryptFilesInFolder 

    File "crypt folder Kopie.py", line 25, in crypt 

    File "crypt folder Kopie.py", line 6, in cryptFilesInFolder 

OSError: [Errno 20] Not a directory: '/Users/bjarne/Desktop/crypt/Neuer Ordner/key Kopie.py' 

Antwort

4

Es scheint, dass Sie versuchen, a bestimmter Befehl für jede Datei in einem Ordner, einschließlich aller Dateien in (rekursiven) Unterordnern dieses Ordners.

In diesem Fall möchten Sie os.walk verwenden, die das angegebene Verzeichnis rekursiv durchlaufen und ein Tupel von (current directory, directories, files) ergeben.

import os 
for (root, dirs, files) in os.walk(rootDir): 
    # In each iteration, files will contain the list of files in the directory, 
    # where directories are traversed recursively. 
    map(lambda f: crypt(f, key, root), files) 

Die map Funktion einfach gilt crypt (na ja, ein Wrapper um crypt) zu jedem Punkt.

map(lambda f: crypt(f, key, root), files) ist funktionell äquivalent zu:

for f in files: 
    crypt(f, key, root)