Как хранить дерево папок / файлов

#python

#python

Вопрос:

Я разрабатываю многопоточное приложение, которое будет отслеживать и обрабатывать файлы в выбранных папках (в соответствии с предпочтениями пользователя).

Каков наилучший способ хранения информации о файлах? (например, пользователь добавляет каталог xxx, мне нужно просмотреть каталог и добавить все файлы и вспомогательный каталог в мое приложение)

Я рассматривал свою собственную древовидную структуру или использовал SQLite.

Спасибо

Комментарии:

1. Это зависит от вашей среды, размера и типа проекта и т.д.

Ответ №1:

SQLite — отличное решение, поскольку оболочка базы данных будет обрабатывать блокировку операций чтения и записи (внутри базы данных) за вас. Вы даже можете использовать столбец в качестве блокировки чтения / записи вашего файла.

Комментарии:

1. Я читал, что существуют ограничения на использование SQLite с многопоточностью. Есть ли другой способ?

2. @user653952 : Два потока не могут работать с одной и той же записью базы данных одновременно, однако в любом случае было бы очень плохо это делать. Вам придется быть осторожным с условиями гонки и т.п., Но вам все равно придется следить за этим — о каких ограничениях вы слышали?

Ответ №2:

Это зависит от вашей среды, размера и типа проекта и т.д.

Самый простой способ — использовать маринованный огурец.

Например, данные находятся в виде кортежа в таком формате:

 actions=(
    {time=..., user=..., action="adddir", name="new folder"},
    {time=..., user=..., action="accessfile", name="/etc/passwords"}
)

#save the data:
f = open('somefile', 'w');
pickle.dump(actions, f)
f.close()

#laod them:
f = open('somefile', 'r');
actions = pickle.load(f)
f.close()
  

Комментарии:

1. Однако для этого вам потребуется самостоятельно обрабатывать блокировку файла pickle. Это зависит от того, как часто вы ожидаете, что несколько процессов захотят читать / записывать в / из одного и того же обработанного файла, и хотите ли вы, чтобы они знали об изменениях, внесенных частично в их цикл чтения / записи.