如何在目录中加密嵌套文件夹

发布于 2025-01-31 12:13:47 字数 786 浏览 1 评论 0原文

我正在尝试制作一个可以加密目录的程序。但是,我目前只能在目录中加密文件,而不得对嵌套的文件夹进行加密。一个例子是,如果您想加密“图片”文件夹,它也将加密“保存的图片”和“相机滚动”以及“图片”中的文件。任何帮助将不胜感激

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

行至春深 2025-02-07 12:13:48

您要做的是递归浏览目录以查找所有文件并对其采取一些操作。 os.listdir 您已经看到的方法只给您是直接目录中的条目。虽然您可以使用该方法编写递归方法(例如检查给定的条目是否是目录,如果是的,则在其上运行os.listdir,Else Encrypt,重复),但必须更易于使用 os.walk ,它将处理递归下方的递归对于您来说,以及将文件与每个级别的目录分开。这里要注意的一件事是files os.walk返回的数组只是该级别的文件的名称,因此您需要将其与<<代码> root 值以获取完整的路径。

重写您的代码以使用该渲染:

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

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')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文