检查文件被完全复制(使用Php)

时间:2014-05-27 06:50:45

标签: php

`

if( completely_copied ) {
        //do some stuff
} else {
        // do some stuff
}

` 目录中有多个图像,图像每5秒处理一次该目录。如何检查这些图像是完全复制到目录还是一半复制?

2 个答案:

答案 0 :(得分:3)

您可以使用md5_file函数检查文件的md5总和:

if ( md5_file($pathToOriginal) == md5_file($pathToCopy) ) {
  // contents are the same
}

以上解决方案允许您检查文件的内容是否完整。但是Hanky 웃 Panky已指出,您还可以检查是否复制了所有文件或仅复制了其中一些文件。如果是这样,您可以尝试:

$fiSource = new FilesystemIterator($sourceDir, FilesystemIterator::SKIP_DOTS);
$fiTarget = new FilesystemIterator($targetDir, FilesystemIterator::SKIP_DOTS);

if ( iterator_count($fiSource) == iterator_count($fiTarget) ) {
  // the amount of files in both directories is equal
}

答案 1 :(得分:1)

这是一种典型情况,有两种/三种策略可供选择:

  1. 使用临时名称存储文件,在该临时名称下,需要文件完成的后续进程将忽略(过滤)该文件。然后,复制过程完成后,重命名该文件。重命名是文件系统上的原子操作,因此它或者已经发生过。没有不完整的状态。这通常可以提供所需的保护。

  2. 上述策略的一个变体是复制和移动文件(而不是复制和重命名)。在文件系统中移动文件也是一种原子操作,因此您可以获得相同的好处。如果复制过程不能使用临时名称,这是有意义的。然后,您可以简单地复制到临时目录,并在复制过程完成后立即以原子方式将文件移动到最终位置。

  3. 如果您使用的是unixoid系统(Linux或某些Unix风格),那么甚至可能不需要:读取和处理的文件的任务的典型行为完全写入是阻止,直到有更多的数据可用。因此,无论文件的写入花费多长时间,打开,读取和处理文件通常都是安全的。处理任务简单地减慢(块),直到整个文件可用。您可能想尝试一下,因为它可能会让您无需执行任何操作。例如,在播放仍在复制的4 GB视频文件时没有问题。如果视频播放器比写入过程快,则它会阻塞,直到有更多数据可用。丑陋但安全。