我是python新手,所以这可能最终有一个简单的解决scheme。
在我家,我有3台电脑,这种情况有关: – 文件服务器(Linux) – 我的主要电脑(Windows) – 女朋友的MacBook Pro
我的文件服务器正在运行ubuntu和samba。 我已经安装了python 3.1,并且已经在3.1中编写了我的代码。
我创build了一个守护进程,用于确定上传目录中某些文件是否存在于给定模式之后。 find这样的文件后,它将其重命名并将其移动到另一个驱动器上的不同位置。 它也重写所有者,组和权限。 所有这一切都很好。 它每分钟运行一次这个过程。
如果我从主pc(运行windows的风格)复制文件,过程总是工作。 (我相信Windows将文件locking到完成复制 – 我可能是错的。)如果我的女朋友复制一个文件,它会在复制完成之前拿起文件,事情变得混乱。 (带有不正确权限的文件的下划线版本被创build,偶尔,文件将进入正确的位置)我在这里猜测,她的mac书不会在复制时locking文件。 那里我也可能是错的。
我需要的是排除正在使用或正在创build的文件的方法。
作为参考,我创build的方法来查找文件是:
# _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)
请注意,这是一个class级。
我创build的方法来操作文件是:
# _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,因为当我开始将文件移动到不同的驱动器时,它似乎停止工作。
简短版本:如何阻止自己search当前正在传输的文件?
提前感谢您提供的任何帮助。
在移动文件之前,您可以尝试对文件进行独占写入锁定。 这可以通过fcntl模块完成:
http://docs.python.org/library/fcntl.html
除此之外,您可以使用lsof
工具来查看系统打开的文件。 这需要更多的苦差事。
请注意,os.rename()将在同一个文件系统上工作,并且实际上可以避免这个问题(inode被移动,没有数据被移动)。 使用shutil将会像mv
一样执行,如果文件系统是相同的文件系统,则重新链接文件;如果文件系统不同,则复制+删除。
原来的写锁定方法没有奏效。 我想我没有正确地测试它在这里更新之前。
我现在决定要做的是:
如果新列表包含与旧列表文件大小相同的文件,则将其放入要传输的列表中。 新列表中的其余文件成为旧列表,并继续进行。
我敢肯定,LSF方法将工作,但我不知道如何在Python中使用它。 此外,这种方法应该适合我的情况,因为我主要关心在传输过程中不移动文件。
我也必须排除所有以“._”开头的文件,因为mac创建了这些文件,而且我不确定它们是否会随着时间的推移而增大。
或者,我可以选择只处理由她的Mac传输的情况。 我知道,当mac传输文件时,它会创建:
我可以检查列表中所有以._开头的文件名实例,并以这种方式排除文件。
我可能会先尝试第二个选项。 这有点肮脏,但希望它会起作用。
Mac中的._文件包含资源分支。 更多信息可以在这里找到: http : //support.apple.com/kb/TA20578
我没有足够的代表发表评论,因此答案。
大多数情况下,你可以放心地忽略它们,因为没有其他的操作系统可以对它们做任何事情。 更多信息在这里: http : //en.wikipedia.org/wiki/Resource_fork