`
if( completely_copied ) {
//do some stuff
} else {
// do some stuff
}
` 目录中有多个图像,图像每5秒处理一次该目录。如何检查这些图像是完全复制到目录还是一半复制?
答案 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)
这是一种典型情况,有两种/三种策略可供选择:
使用临时名称存储文件,在该临时名称下,需要文件完成的后续进程将忽略(过滤)该文件。然后,复制过程完成后,重命名该文件。重命名是文件系统上的原子操作,因此它或者已经发生过。没有不完整的状态。这通常可以提供所需的保护。
上述策略的一个变体是复制和移动文件(而不是复制和重命名)。在文件系统中移动文件也是一种原子操作,因此您可以获得相同的好处。如果复制过程不能使用临时名称,这是有意义的。然后,您可以简单地复制到临时目录,并在复制过程完成后立即以原子方式将文件移动到最终位置。
如果您使用的是unixoid系统(Linux或某些Unix风格),那么甚至可能不需要:读取和处理不的文件的任务的典型行为完全写入是阻止,直到有更多的数据可用。因此,无论文件的写入花费多长时间,打开,读取和处理文件通常都是安全的。处理任务简单地减慢(块),直到整个文件可用。您可能想尝试一下,因为它可能会让您无需执行任何操作。例如,在播放仍在复制的4 GB视频文件时没有问题。如果视频播放器比写入过程快,则它会阻塞,直到有更多数据可用。丑陋但安全。