如何确保给定的文件名可以安全(不存在)写入?

How to make sure that a given filename is safe (doesn't exist) to write to?

提问人:Stan 提问时间:11/10/2023 更新时间:11/10/2023 访问量:35

问:

我有这个代码(更大函数的细节):

$candidate_file_path = '/tmp/data/dir/test_123.txt'; // In the real code, it just keeps trying _1, _2, _3, etc. filenames until one of them doesn't exist.

clearstatcache();
if (!file_exists($candidate_file_path))
{
    if (fopen($candidate_file_path, 'x'))
    {
        clearstatcache();
        return $candidate_file_path;
    }
}

它不断记录错误。因此,存在某种令人沮丧的竞争条件。但是,在之前进行调用的全部意义在于确保它不存在,我们将该选项与 .fopen(/tmp/data/dir/test_123.txt): Failed to open stream: File existsfile_existsxfopen

多年来,我一直对这个函数有问题,无论我重新编码多少次并试图弄清楚到底需要做什么,它似乎都无法正常工作。我需要做些什么才能让它“保留”文件,以便其他脚本无法尝试使用相同的文件名?

目前,我已开始在文件名中添加当前时间(以微秒为单位),以进一步降低两个不同脚本尝试同时使用相同文件名的可能性,但这感觉像是一个非常丑陋和不可靠的黑客,它使函数无法按预期方式工作: 它应该根据所需的文件名保证在任何目录中都有唯一的文件名。

在你告诉我 flock() 之前,我知道这一点!它的手动示例毫无意义,因为 fopen 是在 flock() 调用之前执行的,这意味着无论错误何时已经存在,它都会记录/打印错误。

PHP 的Linux

评论

1赞 Adi 11/10/2023
使用方法也不起作用吗?tempnam()
0赞 Stan 11/10/2023
@Adi我不知道PHP中存在该函数...它在内部有什么作用?
0赞 Adi 11/10/2023
它将指定的目录路径与唯一标识符组合在一起,创建一个新的临时文件,基本上生成一个唯一的临时文件名
0赞 Stan 11/10/2023
@Adi我的意思是,它与我的代码有什么不同?
0赞 Adi 11/10/2023
通过附加 _1、_2 等来创建唯一文件名的方式,以防文件已存在。其中,as 以更原子化的方式生成唯一文件名,将目录路径和唯一标识符组合在一起,以创建文件名,该文件名不仅在创建时是唯一的,而且不易受到竞争条件的影响tempnam()

答: 暂无答案