我是 python 新手,所以这可能最终有一个简单的解决方案。
在我家,我有 3 台与这种情况相关的电脑: - 文件服务器 (linux) - 我的主电脑 (windows) - 女朋友的 MacBook Pro
我的文件服务器正在运行 ubuntu 和 samba。我已经安装了 python 3.1,并在 3.1 中编写了我的代码。
我创建了一个守护进程,它确定上传目录中何时存在遵循给定模式的某些文件。找到此类文件后,它会对其进行重命名并将其移动到不同驱动器上的不同位置。它还重写了所有者、组和权限。所有这一切都很好。它每分钟运行一次这个过程。
如果我从我的主 PC 复制文件(运行 Windows 风格),该过程总是有效的。(我相信 Windows 会锁定文件直到它完成复制——我可能是错的。)如果我的女朋友复制一个文件,它会在复制完成之前拿起文件,事情变得一团糟。(创建了具有不正确权限的文件的下划线版本,有时文件会进入正确的位置)我在这里猜测她的mac book在复制时没有锁定文件。我在那里也可能是错的。
我需要的是一种方法来排除正在使用或正在创建的文件。
作为参考,我创建的查找文件的方法是:
# _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 因为当我开始将文件移动到不同的驱动器时它似乎已经停止工作。
简短版:如何防止自己在搜索中拾取当前正在传输的文件?
提前感谢您提供的任何帮助。