Как исключить файлы из поиска, которые могут быть использованы или скопированы в 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 ответа:
Вы можете попробовать установить эксклюзивную блокировку записи на файл перед его перемещением. Это можно сделать с помощью модуля 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