提问人:Stan 提问时间:11/10/2023 更新时间:11/10/2023 访问量:35
如何确保给定的文件名可以安全(不存在)写入?
How to make sure that a given filename is safe (doesn't exist) to write to?
问:
我有这个代码(更大函数的细节):
$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 exists
file_exists
x
fopen
多年来,我一直对这个函数有问题,无论我重新编码多少次并试图弄清楚到底需要做什么,它似乎都无法正常工作。我需要做些什么才能让它“保留”文件,以便其他脚本无法尝试使用相同的文件名?
目前,我已开始在文件名中添加当前时间(以微秒为单位),以进一步降低两个不同脚本尝试同时使用相同文件名的可能性,但这感觉像是一个非常丑陋和不可靠的黑客,它使函数无法按预期方式工作: 它应该根据所需的文件名保证在任何目录中都有唯一的文件名。
在你告诉我 flock()
之前,我知道这一点!它的手动示例毫无意义,因为 fopen 是在 flock()
调用之前执行的,这意味着无论错误何时已经存在,它都会记录/打印错误。
答: 暂无答案
评论
tempnam()
tempnam()