如何从搜索中排除可能正在使用或被复制到python中的文件?

时间:2010-11-05 22:35:40

标签: python windows linux macos samba

我是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,因为当我开始将文件移动到不同的驱动器时,它似乎已停止工作。

简短版本: 如何防止自己在搜索中挑选当前正在传输的文件?

提前感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:0)

您可以尝试在移动文件之前对文件执行独占写锁定。这可以通过fcntl模块完成:

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

除此之外,您可以使用lsof实用程序查看系统已打开的文件。这需要更多的苦差事。

请注意,os.rename()将在同一个文件系统上运行,并且实际上可以免受此问题的影响(inode被移动,没有数据被移动)。使用shutil会像mv一样,如果文件系统相同,则重新链接文件,如果文件系统不同,则复制+删除。

答案 1 :(得分:0)

原来写锁定方法不起作用。我想在更新之前我没有正确测试它。

我现在决定做的是:

  • 将支票间隔缩短至30秒
  • 保留在中找到的文件列表 上一次迭代和他们的 各自的文件大小
  • 根据旧列表检查新文件列表

如果新列表包含与旧列表具有相同文件大小的相同文件,请将其放入要传输的列表中。新列表中的其余文件将成为旧列表,并且该过程将继续。

我确定lsof方法可行,但我不确定如何在python中使用它。此方法也应该适用于我的情况,因为我主要关心的是在文件传输过程中不移动文件。

我还必须排除以“._”开头的所有文件,因为mac会创建这些文件,但我不确定它们是否会随着时间的推移而增加。

或者,我可以选择处理由她的mac传输的情况。我知道当mac传输文件时,它会创建:

  • FILENAME.EXT
  • ._ FILENAME.EXT

我可以检查所有文件名实例的列表,其前面是._,并以这种方式排除文件。

我可能会先尝试第二种选择。它有点脏,但希望它会起作用。

答案 2 :(得分:0)

mac中的._文件包含资源分支。可以在此处找到更多信息:http://support.apple.com/kb/TA20578

我没有足够的代表发表评论,因此得到答案。

在大多数情况下,您可以安全地忽略它们,因为无论如何其他操作系统都无法对它们做任何事情。有关它们的更多信息: http://en.wikipedia.org/wiki/Resource_fork

相关问题