блокирование файлов ворд системой и функция unlink

n1kolay

Новичок
блокирование файлов ворд системой и функция unlink

Добрый день.
Ситуация в следующем. Задача для сети интранет.
необходимо узнать открыт ли файл ворд или ексель на сервере как-нибудь приложением.
Как в ситуации когда в общей папке есть файл ворд, который открыт одним пользователем, и при попытке другим пользователем открыть возникает сообщение о возможности открытия только в режиме чтения.

с данной ситуацией замечательно справляется такая конструкция:

PHP:
if (unlink ('temp2/1.doc')) 
echo "Удален"; 
else 
echo "Файл занят";
если word'ом открыть файл 1.doc и вызвать скрипт то ответ будет следующим

Warning: unlink(temp2/1.doc) [function.unlink]: Permission denied
Файл занят

а файл не будет удален
если же файл не открыт, то он будет удален.

Проблема же состоит в том, что никакие другие функции кроме unlink типа fileperms, is_writable и другие не дают определить открыт ли файл в данный момент. Все они выдают одинаковый ответ как при открытом так и при свободном от приложения файле.

Суть задачи: определить открыт ли файл кем-то в данный момент, если открыт то ничего не предпринимать и спросить позже, если же не открыт то произвести определенные манипуляции с ним.
Естественно, при использовании unlink манипулировать в случае положительного ответа уже не с чем, файл удалиться.
 

mity

Новичок
fopen("sample.doc", 'a') прекрасно работает, файл расположен на этом же компьютере WinXP SP3, php 5.3.2, safe thread.

Поробуйте переименовывать файл во временное имя и потом сразу назад
PHP:
if(@rename("name.doc","tmp.doc")){
  rename("tmp.doc","name.doc"){
  $f= fopen("name.doc","r+b");
  flock($f,LOCK_EX);//сразу лочим чтобы никто c файлом писал
  

};
 

n1kolay

Новичок
fopen так и не дал у меня результатов
а вот с rename получилось
большое спасибо
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
>Задача для сети интранет.

по сifs/samba/netbios локи скорее всего работать не будут, потому и открыть на запись можно
 

mity

Новичок
TutanXamoN file_exists("~$".$doc_name) это совсем детская проверка.
При внештатном закрытии ворда этот файл всегда остаётся. К тому же "~$".$doc_name может быть удалён любым пользователем, в то время когда $doc_name будет редактироваться в ворде.
 

TutanXamoN

Новичок
mity
Угу. Абсолютно согласен.
Да говнокод.
Да херня.
Да есть 2-е ситуации которые сходу говорят нам о том что это не эсть гут.
Но учитывая тот замечательный факт, что и rename оставляет нам поле для саботажа)
Бескомпромиссный вариант достигается лишь при использовании COM.

-~{}~ 04.05.10 00:06:

ЗЫ: кстати, интересный момент: офис не проверяет существования пользовательского файла
PHP:
"~$".$name
и безбожно затирает его своим темпом :)
 
Сверху