Как исключить файлы из поиска, которые могут быть использованы или скопированы в python?


Я новичок в python, так что это может закончиться простым решением.

У меня дома есть 3 компьютера, которые имеют отношение к этой ситуации.: - Файловый сервер (linux) - Мой основной ПК (windows) - MacBook Pro подруги

Мой файловый сервер работает под управлением ubuntu и samba. Я установил python 3.1 и написал свой код в 3.1.

Я создал демон, который определяет, когда определенные файлы существуют в каталоге uploads, которые следуют заданному шаблону. Найдя такой файл, он переименовывает его и перемещает в другое место на другом диске. Он также переписывает владельца, группу и разрешения. Все это прекрасно работает. Он запускает этот процесс каждую минуту.

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

Что мне нужно, так это способ исключить файлы, которые либо используются, либо, в противном случае, создаются.

Для справки, метод, который я создал, чтобы найти файлы:

# _GetFileListing(filter)
# Description: Gets a list of relevant files based on the filter
#
# Parameters: filter - a compiled regex query
# Retruns:
#   Nothing. It populates self.fileList
def _GetFileListing(self, filter):
    self.fileList = []
    for file in os.listdir(self.dir):
        filterMatch = filter.search(file)
        filepath = os.path.join(self.dir, file)

        if os.path.isfile(filepath) and filterMatch != None:
            self.fileList.append(filepath)

Обратите внимание, это все в классе.

Метод, который я создал для управления файлами это:

# _ArchiveFile(filepath, outpath)
# Description: Renames/Moves the file to outpath and re-writes the file permissions to the permissions used for
#   the output directory. self.mask, self.group, and self.owner for the actual values.
#
# Parameters: filepath - path to the file
#             outpath - path to the file to output
def _ArchiveFile(self, filepath, outpath):
    dir,filename,filetype = self._SplitDirectoryAndFile(outpath)

    try:
        os.makedirs(dir, self.mask)
    except OSError:
        #Do Nothing!
        dir = dir

    uid = pwd.getpwnam(self.owner)[2]
    gid = grp.getgrnam(self.group)[2]
    #os.rename(filepath, outpath)
    shutil.move(filepath, outpath)
    os.chmod(outpath, self.mask)
    os.chown(outpath, uid, gid)

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

Краткая Версия: Как я могу запретить себе собирать файлы в моем поиске, которые в настоящее время передаются?

Заранее благодарю вас за любую помощь, которую вы можете оказать.
3 2

3 ответа:

Вы можете попробовать установить эксклюзивную блокировку записи на файл перед его перемещением. Это можно сделать с помощью модуля fcntl:

Http://docs.python.org/library/fcntl.html

За исключением этого, вы можете использовать утилиту lsof, чтобы увидеть файлы, которые Система открыла. Это требует еще большего труда.

Обратите внимание, что ОС.rename() будет работать на той же файловой системе и фактически будет невосприимчив к этой проблеме (индекс перемещается, данные не перемещаются). Использование shutil будет делать то же самое, что и mv , то есть либо повторно связать файл, если это та же файловая система, либо скопировать + удалить, если файловые системы отличаются.

Оказывается, подход блокировки записи не сработал. Наверное, я не проверил его должным образом, прежде чем обновить здесь.

На данный момент я решил сделать следующее:

  • сократите время между проверками до 30 секунд
  • сохраните список файлов, найденных в предыдущая итерация и их соответствующие размеры файлов
  • сверьте новый список файлов со старым списком

Если новый список содержит тот же файл с тем же размером файла, что и старый список, поместите его в Список для переноса. Оставшиеся файлы в новом списке становятся старым списком, и процесс продолжается.

Я уверен, что метод lsof будет работать, но я не уверен, как использовать его в python. Кроме того, этот метод должен работать довольно хорошо для моей ситуации, так как я в основном озабочен тем, чтобы не перемещать файлы, пока они находятся в пути.

Я также должен исключить все файлы, которые начинаются с "._ "так как mac создает их, и я не уверен, что они увеличиваются в размере с течением времени.

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

  • имя файла.ext
  • ._имя файла.ext

Я мог бы проверить список для всех экземпляров filename, где ему предшествует ._ и исключить файлы таким образом.

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

The ._ файлы с компьютера mac содержат вилки ресурсов. Дополнительную информацию можно найти здесь: http://support.apple.com/kb/TA20578

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

По большей части вы можете спокойно игнорировать их, так как никакая другая ОС, вероятно, ничего не сможет с ними сделать. Подробнее о них здесь: http://en.wikipedia.org/wiki/Resource_fork