2013-07-11 2 views
4

У меня есть сценарий очистки, который перемещает файлы XLS из одного места в другое. для этого процесса перемещения файла я использовал функцию переименования. Этот скрипт работает нормально. но когда файл XLS открыт, когда я пытаюсь переместить этот xls, я получаю ошибку, которая просто говорит «Невозможно переименовать sample.xls». Но я хотел бы добавить такие функциональные возможности, как: проверить, что XLS открыт до начала функции переименования.PHP Проверьте, что файл открыт перед переименованием

Я считаю, что это вызов функции flock, но это применимо только для файла TXT.

Как проверить файл XLS открывается перед вызовом функции переименования.

+0

Вместо того, чтобы проверить, является ли он открытым, рассмотрим только поймать ошибку, если она пойдет не так: 'если (переименование (.., ..)) {} ' –

+0

Я не думаю, что' flock' предназначен только для файлов .txt .. вы пробовали? – naththedeveloper

+0

Вы решили изменить поведение, чтобы файлы были скопированы в новое место, а не перемещены, а затем cronjob попытается очистить старые бесполезные файлы. Если они открыты или не удалены, cronjob попытается удалить файл во время следующего выполнения. Это общий подход. – Eggplant

ответ

3

Одна простая вещь, которую вы могли бы попробовать это использовать flock приобрести эксклюзивную блокировку на файл и, если он не вы будете знать, что файл используется:

<?php 
$fp = fopen('c:/your_file.xlsx', 'r+'); 
if(!flock($fp, LOCK_EX)) 
{ 
    echo 'File is being used...'; 
    exit(-1); 
} 
else 
{ 
    fclose($fp); 
    // rename(...); 
} 

Альтернативой было бы проверить существование файла запирающего обычно превосходят создает, когда файл используется:

<?php 
$file = 'c:/testfile.xlsx'; 
$lock = 'c:/~$testfile.xlsx'; 
if (file_exists($lock)) 
{ 
    echo "Excel $file is locked."; 
} 
else 
{ 
    echo "Excel $file is free."; 
} 

скрытое файл обычно называют с приставкой ~$ как для старых файлов первенствовать я believ e 2003 и старше файлы блокировок сохраняются в папке temp со случайным именем, например ~DF7B32A4D388B5854C.TMP, поэтому было бы довольно сложно узнать.

+0

Я просто пробовал это всего минуту назад. Я открыл XLS и запустил этот код. но моя функция переименования получает выполнение. – Bharanikumar

+0

@Bharanikumar и он не работает или работает? PHP не лучшее решение для этого случая специально для ОС Windows, C# или C++ будет более подходящим IMHO. – Prix

+0

ho my god.then, какова цель этого стада. – Bharanikumar

2

Вы должны использовать flock(). Это помещает флаг в файл, чтобы другие скрипты были проинформированы о том, что файл используется. Флаг выключается либо намеренно, используя fclose, либо неявно в конце сценария.

1

Использование блокировки файлов, как:

flock($file,LOCK_EX); 

см this

Смежные вопросы