2016-04-26 3 views
2

У меня есть приложение для анализа данных в Python, запущенном в Windows. Я хочу, чтобы пользователи имели возможность скопировать папку, содержащую файлы данных, в папку «в коробке», после чего мое приложение начнет обработку данных. Мой вопрос имеет Windows, обеспечивает событие, когда копия каталога завершенаЗнайте, когда копия каталога завершена

Благодаря

+0

Пожалуйста, покажите свой код. Как вы копируете файлы, асинхронно? –

+1

Нет, само по себе это невозможно. Если бы это был только один файл, вы могли бы проверить, можете ли вы его переименовать, но это не будет работать для каталогов. Если у вас есть некоторый контроль над копированием, вы можете создать файл 'still.working' в начале копии и удалить его как последний шаг. В противном случае вам остается сравнить последние измененные атрибуты и ждать достаточного количества времени после этого. – thebjorn

+0

Если вы можете начать обработку файлов, как только отдельные _files_ будут завершены, то сторожевой таймер (http://pythonhosted.org/watchdog/) может быть решением. – thebjorn

ответ

0

Там, наверное, лучший способ сделать это, но вы могли бы латать его немного путем подсчета количества файлов в папке, чтобы начать с , а затем ждать, пока нет увеличения этой суммы, например, так:

import glob, os, time 
directory = os.path.join('inbox','*') #Uses wildcard so ANY files in the 'inbox' directory are used. 
numFiles = len(glob.glob(directory)) #Gets initial number of files 
while True: 
    numFilesNew = len(glob.glob(directory)) #Gets current number of files 
    if numFilesNew > numFiles: #Compare current amount of files to initial 
     break #Exit loop if there's an increase 
    else: time.sleep(1) #Wait if no files were added 
files = glob.glob(directory) #Make a list of filenames in the directory 
print(files) 

Для тех, кто не уверен, glob.glob по существу возвращает список файлов в заданной директории.

Этот код был написан на Python 3.4, но я не вижу причины, по которым он не будет работать в других версиях.

Если вы хотите только файлы определенного расширения, то вы можете обменять

directory = os.path.join('inbox','*') 

для

directory = os.path.join('inbox','*.png') 

Но изменения курса «.png» для любой расширение файла вам нужно. Конечно, это не значит, что файл, о котором идет речь, на самом деле относится к этому формату/типу, только если он имеет расширение.

Это мой первый ответ на этом сайте, надеюсь, что это поможет! :)

0

Я знаю, что это поздний ответ, но просто хочу представить больше мыслей.

Ответ, который дал TheCatOfWar имеет недостаток: Решение предполагает, что файл или каталог файлов могут быть скопированы полностью в течение одной секунды, что не всегда бывает, когда речь идет о больших файлов или каталогов.

Я проверил свой код в Windows 7 с каталогом, который содержит много файлов, полностью до 3 ГБ. Сценарий остановился на короткое мгновение после того, как я начал копировать этот большой каталог, потому что каталог был создан в «входящей», но все файлы были скопированы.

Независимо от того, сколько секунд вы спите там, просто небезопасно гарантировать, что у вас есть полностью скопированный каталог, когда цикл while прерывается.

Я думаю, что комментарий дается thebjorn это лучше и, что более важно, безопасный способ пойти: Используйте файл флаг, чтобы указать конец копии, если у вас есть контроль над боковой копией инициатора. Это решение, которое я сейчас пытаюсь сделать.

Смежные вопросы