Как проверить размер каталога / как убедиться, что перемещение файлов завершено - PullRequest
0 голосов
/ 13 июля 2020

У меня есть сценарий, который просматривает папку наблюдения rootdir, в которой есть другие папки. Каждая папка может содержать: movie.mp4, trailer.mp4, xmlfile.xml, picture.jpg, subtitles1.dfxp, subtitles2.dfxp.

Затем сценарий начинает оценивать, можно ли упаковать файлы в архив - требуется найти: movie.mp4, picture.jpg, xmlfile.xml. Остальные файлы необязательны.

Я столкнулся с проблемой:

  1. Предположим, у нас есть папка testfolder, которую я хочу переместить в rootdir.
  2. testfolder содержит файлы: movie.mp4, trailer.mp4, subtitles1.dfxp, picture.jpg, xmlfile.xml.
  3. testfolder перетаскивается в rootdir.
  4. Во время перемещения каталога testfolder, оценка на упаковку выполнена.
  5. Файлы movie.mp4, picture.jpg, xmlfile.xml уже переданы, однако trailer.mp4 и subtitles1.dfxp все еще в процессе передачи.
  6. Скрипт начинает упаковку 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...