Как исключить из поиска файлы, которые могут использоваться или копироваться в python? - PullRequest
2 голосов
/ 06 ноября 2010

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

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

Мой файловый сервер работает под управлением Ubuntu и Samba. Я установил Python 3.1 и написал свой код в 3.1.

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

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

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

Для справки я создал метод поиска файлов:

# _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.rename, потому что, кажется, он перестал работать, когда я начал перемещать файлы на другие диски.

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

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

Ответы [ 3 ]

0 голосов
/ 09 ноября 2010

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

На данный момент я решил:

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

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

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

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

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

  • имяфайла.рсш
  • ._ имяфайла.рсш

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

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

0 голосов
/ 09 ноября 2010

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

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

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

0 голосов
/ 06 ноября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...