Victor.dMdB
Victor.dMdB

Reputation: 1019

Check if a file is writable before writing to it

I'm trying to create a script which will check if a file is writable before writing to it,

Making sure the script doesn't exit prematurely.

I've gotten this far

$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");

When I test the script with $file open, it blocks on the sleeping part even after $file is closed.

I'm fairly new to PHP, so there might be a processing paradigm that i'm not aware of.

Any help would be very welcome.

EDIT : The reason I entered this into a while loop is to continually check if the file is open or not. Hence it should only exit the while loop once the file is finally writable.

The sleep is simply to replicate a person trying to open the file.

Upvotes: 3

Views: 4637

Answers (4)

jitendrapurohit
jitendrapurohit

Reputation: 9675

Using touch():

if (touch($file_name) === FALSE) {
  throw new Exception('File not writable');
}

Upvotes: 1

Moseleyi
Moseleyi

Reputation: 2859

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

Upvotes: 2

PhearOfRayne
PhearOfRayne

Reputation: 5050

You probably should not be using a while loop just to check if the file is writable. Maybe change your code around a bit to something like this:

$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");

However since I do not know what your main goal is you could do it like this:

$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");

Upvotes: 0

NullPoiиteя
NullPoiиteя

Reputation: 57312

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';
}

Upvotes: 3

Related Questions