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