检查文件是否“完整”(使用Python)

3

使用Python或命令行,是否可以检查文件是否已完成复制或完整?
我在Mac OSX上以编程方式操作特定文件夹中的文件,但需要在运行进行操作的代码之前检查文件是否完整。

6个回答

4
Unix/Mac OS X文件系统中没有“文件完整性”的概念。您可以尝试使用flock锁定文件,或者更简单的方法是将文件复制到目标目录的子目录中,一旦它们完全复制完成就将它们移出(假设您对执行复制的程序有控制权)。移动是一个原子操作;一旦文件出现在预期路径上,您就知道该文件已完全复制。

2
如果您感兴趣的话,这是一篇关于文件锁定在Python中的通用介绍和精彩文章:http://apenwarr.ca/log/?m=201012#13。 - Humphrey Bogart
我有一个程序,它基于FSevents对文件进行操作,所以我不能在我的情况下复制或锁定它。 - aschmid00

3

在复制文件之前,对该文件进行MD5加密,然后每当您认为已经完成复制时再次进行加密。当它们匹配时,您就可以继续了。为此,请使用hashlib模块中的MD5。


我无法控制复制。我只在文件事件上启动函数。因此,我无法对我不知道来源的文件进行MD5处理。 - aschmid00

2
如果您知道文件从哪里复制,可以检查复制的大小是否达到了原始大小。
或者,如果文件大小在几秒钟内没有变化,它可能已经完成复制,这可能足够好。(但对于慢速网络连接可能不起作用。)

我不知道文件来自哪里,但文件大小的变化可能是一个选项。 - aschmid00
1
似乎文件大小直到完成后才会保持为0。这是我想要的最简单和最快的方法。 - aschmid00
很有趣。这可能是特定于平台的行为,或者可能因文件大小而异,所以要小心! - kindall
不要认为它是特定于文件大小的,我尝试了不同的文件大小,但它对所有文件都保持为0。这可能是特定于OSX的,但我只需要在该平台上使用它。 - aschmid00

1

看起来你控制着(Python?)程序进行复制。你使用什么命令进行复制?我认为编写代码以阻塞直到复制操作完成应该足够了。

这个程序是多线程还是多进程的?如果是,你可以在文件路径完成时将它们添加到队列中,然后让另一个线程只处理队列中的项目。


不,我无法控制复制。我会根据文件事件启动操作。 - aschmid00

0

你可以使用lsof并解析打开的句柄列表。如果某个进程仍然在文件上保持打开的句柄(即正在写入),则可以在那里找到它。


0
你可以这样做:
import os

# Get the file size two times, now and after 3 seconds.
size_1 = os.path.getsize(file_path)
time.sleep(3)
size_2 = os.path.getsize(file_path)
# compare the sizes.
if size_1 == size_2:
    # Do something.
else:
    # Do something else.

您可以根据自己的需要更改时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接