3

我正在尝试创建一个脚本,该脚本将在写入文件之前检查文件是否可写,

确保脚本不会过早退出。

我已经走到了这一步

$meta =stream_get_meta_data($file);
while(!is_writable($meta['uri'])){
  sleep(rand(0,3));
  $meta=stream_get_meta_data($file);
  echo("sleeping\n");
}
$csv = fopen($file, 'a+')or die("can't open file");

当我在打开 $file 的情况下测试脚本时,即使在 $file 关闭后,它也会在睡眠部分阻塞。

我对 PHP 相当陌生,所以可能有一个我不知道的处理范例。

任何帮助都会非常受欢迎。

编辑:我将其输入 while 循环的原因是不断检查文件是否打开。因此,只有在文件最终可写时,它才应该退出 while 循环。

睡眠只是为了复制一个试图打开文件的人。

4

4 回答 4

3

its is_writable ( string $filename )

$filename = 'test.txt';
if (is_writable($meta['uri']) {
    echo 'The file is writable';
} else {
    echo 'The file is not writable';
}
于 2012-12-18T09:02:14.530 回答
2
is_writable(<your_file>)

This should do the trick?

http://www.php.net/manual/en/function.is-writable.php

--

Also you can use

@fopen(<your_file>, 'a')

If this returns false, file is not writiable

于 2012-12-18T09:01:54.163 回答
1

使用touch()

if (touch($file_name) === FALSE) {
  throw new Exception('File not writable');
}
于 2016-01-13T07:21:29.317 回答
0

您可能不应该使用 while 循环来检查文件是否可写。也许将您的代码更改为以下内容:

$meta =stream_get_meta_data($file);

if (is_writable($file)){
  sleep(rand(0,3));
  $meta=stream_get_meta_data($file);
  echo("sleeping\n");
}

$csv = fopen($file, 'a+')or die("can't open file");

但是,由于我不知道您的主要目标是什么,您可以这样做:

$meta =stream_get_meta_data($file);

while(!is_writable($file)){
  sleep(rand(0,3));
  $meta=stream_get_meta_data($file);
  echo("sleeping\n");
}

$csv = fopen($file, 'a+')or die("can't open file");
于 2012-12-18T09:02:49.263 回答