У меня есть сценарий, который просматривает папку наблюдения rootdir
, в которой есть другие папки. Каждая папка может содержать: movie.mp4, trailer.mp4, xmlfile.xml, picture.jpg, subtitles1.dfxp, subtitles2.dfxp
.
Затем сценарий начинает оценивать, можно ли упаковать файлы в архив - требуется найти: movie.mp4, picture.jpg, xmlfile.xml
. Остальные файлы необязательны.
Я столкнулся с проблемой:
- Предположим, у нас есть папка
testfolder
, которую я хочу переместить в rootdir
. testfolder
содержит файлы: movie.mp4, trailer.mp4, subtitles1.dfxp, picture.jpg, xmlfile.xml
. testfolder
перетаскивается в rootdir
. - Во время перемещения каталога
testfolder
, оценка на упаковку выполнена. - Файлы
movie.mp4, picture.jpg, xmlfile.xml
уже переданы, однако trailer.mp4
и subtitles1.dfxp
все еще в процессе передачи. - Скрипт начинает упаковку
movie.mp4, picture.jpg, xmlfile.xml
, так как требования к упаковке выполнены. subtitles1.dfxp
и trailer.mp4
опущены, потому что они не учитывались в файлах, которые необходимо упаковать.
Как я могу предотвратить такую ситуацию? Как я могу убедиться, что нет дополнительных, необязательных файлов, ожидающих полной передачи?
Моя идея заключалась в том, чтобы проверить размер папки, прежде чем оценивать файлы для упаковки. Я хотел проверить текущий размер папки, подождать одну секунду и снова проверить размер. Если размер останется прежним, это означает, что передача файлов завершена. Однако возникла другая проблема. Для расчета размера папки необходима сумма размеров каждого файла в папке. Проверить размер папки напрямую невозможно. Кроме того, во время передачи одного файла при проверке размера файла во время передачи (например, я создал al oop, который проверяет размер файлов в каталоге каждую секунду, а затем перетаскивает огромный файл), он уже дает окончательный размер. Все это подводит меня к выводу, что невозможно проверить, находится ли папка во время передачи или она уже завершена.
Знаете ли вы какое-либо возможное решение, чтобы убедиться, что все файлы перенесены?
while True:
for dirpath, dirnames, filenames in os.walk(rootdir):
# Object FolderInfo contains objects 'FileInfo'
folder = FolderInfo()
folder.folderPath = dirpath
obj = os.scandir(path=dirpath)
for entry in obj:
if entry.is_file():
# Object FileInfo contains information about path, filename, type (movie,trailer etc)
file = FileInfo(entry.name)
file.get_file_information(rootdir, dirpath)
folder.append_file(file)
# If at least 3 files were found, assessment for packing is performed.
if len(folder.listOfFiles)>=3:
# Verify checks if movie+image+xmlfile was found, if so it sets folder.packingFlag to True
folder.verify()
if folder.packingFlag == True:
# Folder containing information of files paths that are going to be packed is passed to foldersReadyToPack list
self.foldersReadyToPack.append(folder)
obj.close()
if len(self.foldersReadyToPack) > 0:
# After traversing through all directories in rootdir packingQueue is created, it contains folders of list foldersReadyToPack
packingQueue = PackingQueue(self.foldersReadyToPack)
# Here the packing is performed
packingQueue.execute_packing()
time.sleep(int(self.scanTime))