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