Home > Software design >  How to encrypt nested folders inside a directory
How to encrypt nested folders inside a directory

Time:05-22

I am trying to make a program that can encrypt a directory. What I have currently though, can only encrypt files inside the directory and not encrypt the folders nested. An example would be if you wanted to encrypt the "Pictures" folder, it would also encrypt the "Saved Pictures" and "Camera Roll" along with the files inside "Pictures". Any help would be appreciated

from cryptography.fernet import Fernet
import os

'''
def write_key():
    key = Fernet.generate_key()
    with open('key.key', "wb") as key_file:
        key_file.write(key)
'''


def load_key():
    file = open('key.key', 'rb')
    key_ = file.read()
    file.close()
    return key_


key = load_key()
fer = Fernet(key)

os.chdir(r"C:\Users\{user}\encrypt_test".format(user=os.getlogin()))
files = os.listdir()
print(files)

for i in range(len(files)):

    with open(files[i], 'rb') as f:
        data = f.read()

    with open(files[i], 'w') as f:
        print(len(data))
        f.write(fer.encrypt(data).decode())
        print('done')






CodePudding user response:

What you're asking to do is recursively go through a directory to find all files and apply some action to it. The os.listdir method as you've seen only gives you the entries in the immediate directory. While you could use that method to write a recursive method (e.g. check if a given entry is a directory, if so, run os.listdir over it, else encrypt, repeat), it's must easier to use os.walk which will handle the recursion down the file tree for you, as well as separating out the files from directories at each level. The one thing to note here is the files array that os.walk returns is just the names of the files at that level, and so you need to combine it with the root value to get the full path.

Rewriting your code to use that renders:

from cryptography.fernet import Fernet
import os
import path

'''
def write_key():
    key = Fernet.generate_key()
    with open('key.key', "wb") as key_file:
        key_file.write(key)
'''


def load_key():
    file = open('key.key', 'rb')
    key_ = file.read()
    file.close()
    return key_


key = load_key()
fer = Fernet(key)

os.chdir(r"C:\Users\{user}\encrypt_test".format(user=os.getlogin()))

for root, dirs, files in os.walk('.'):
    print(files)
    for filename in files:
        filepath = path.join(root, filename)

        with open(filepath, 'rb') as f:
            data = f.read()

        with open(filepath, 'w') as f:
            print(len(data))
            f.write(fer.encrypt(data).decode())
            print('done')
  • Related