Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт янв 19, 2018 09:25

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Ср мар 09, 2011 17:39 
registration писал(а):
возникает ошибка: 1772 File_Busy_Test2: Ошибка стека в Action:
и файл держится уже кроном (возможно не срабатывает CLOSE-FILE DROP)
Подскажите в чём проблема со стеком?

GetLastError ненужен.

Код:
\ ...
  R/W OPEN-FILE-SHARED ( h|0   0|ior )
  DUP IF  NIP 32 <>   ELSE   DROP CLOSE-FILE THROW TRUE  THEN
UNTIL
  \ файл уже закрыт, если был открыт.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Ср мар 09, 2011 20:38 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Может, на стеке муча кусора остается после отработки циклов?

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)



За это сообщение автора WingLion поблагодарил: ctrl-C
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Чт мар 10, 2011 18:41 
Не в сети

Зарегистрирован: Ср фев 16, 2011 15:41
Сообщения: 7
Благодарил (а): 5 раз.
Поблагодарили: 2 раз.
WingLion писал(а):
Может, на стеке муча кусора остается после отработки циклов?
Вполне возможно, только как проверить?
Код любезно предоставленный Гостем вроде рабочий,ошибка не возникает (????), только непопонятно многое.

Написал стековую нотацию для кода, чтоб понять происходящее на стеке
Есть такие вопросы
1. для чего дублировать ior на вершине стека, если потом одну копию его удаляем?
2. Непонятно как выполняется CLOSE-FILE при таком состоянии стека на момент
исполнения?
Код:
FOUND-FULLPATH R/W OPEN-FILE-SHARED (  --> fileid ior )
  DUP ( fileid ior --> fileid ior ior )
  \ Вопрос: для чего дублировать ior?
IF ( --> )( fileid ior ior --> fileid ior ior )
  \ если ior <> 0
   \ Вопрос: Если далее мы ior удаляем?
  NIP ( fileid ior ior --> fileid ior )
  32 ( fileid ior --> fileid ior 32 )
  <> ( fileid ior 32 --> fileid flag )
ELSE ( --> )( fileid 0 0 --> fileid 0 0 )
  \ если ior OPEN-FILE-SHARED = 0
  \ т.е. файл нормально открылся
  DROP ( fileid 0 0 --> fileid 0 )
  \ А ниже мне непонятно, для CLOSE-FILE
  \ на стеке должно быть ( fileid -->
  \ а у нас ( fileid 0 -->
  CLOSE-FILE ( fileid 0 --> ???? )
  \ дальше я стек отследить не смог
  THROW
  TRUE
THEN



За это сообщение автора registration поблагодарил: ctrl-C
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Чт мар 10, 2011 19:42 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4840
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 52 раз.
registration писал(а):
DUP ( fileid ior --> fileid ior ior )
\ Вопрос: для чего дублировать ior?
IF ( --> )( fileid ior ior --> fileid ior ior )

тут ошибочка в стековой нотации. Дублируется ior как раз для IF , который поглащает флаг, т.е. нижняя строчка должна выглядеть так:
IF ( fileid ior ior --> fileid ior )
registration писал(а):
\ Вопрос: Если далее мы ior удаляем?
NIP ( fileid ior ior --> fileid ior )

нет, ошибка была выше, удаляется fid
registration писал(а):
32 ( fileid ior --> fileid ior 32 )
<> ( fileid ior 32 --> fileid flag )

соответственно не так, а:
<> ( ior 32 --> flag )
ну и так далее.
Одна из идей Форта в том, что входящие параметры ВСЕГДА ПОГЛОЩАЮТСЯ (хотя ему следуют не всегда).

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur



За это сообщение автора mOleg поблагодарили - 2: ctrl-C, registration
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Пт мар 11, 2011 17:23 
Не в сети

Зарегистрирован: Ср фев 16, 2011 15:41
Сообщения: 7
Благодарил (а): 5 раз.
Поблагодарили: 2 раз.
Спасибо, mOleg, за потраченное на меня время. Исправил стековую нотацию. Возникли ещё вопросы.
1. Перед IF на стеке отсутствует результат операции сравнения ( flag ). В IF входим со значением ior оставшимся от OPEN-FILE-SHARED
Вопрос: это и будет, в данном случае, flag для IF?
2. Мне непонятно, что для THROW на стеке должно быть и что останется, на стеке когда THROW отработает?
3. Для чего вообще THROW в данном коде?
Код:
FOUND-FULLPATH R/W OPEN-FILE-SHARED (  --> fileid ior )
  DUP ( fileid ior --> fileid ior ior )
  \ перед IF на стеке отсутствует результат операции
  \ сравнения ( flag ). В IF входим со значением ior
  \ оставшимся от OPEN-FILE-SHARED
  \ Вопрос: это и будет, в данном случае, flag для IF?
IF ( fileid ior ior --> fileid ior )
  \ если ior <> 0
  NIP ( fileid ior --> ior )
  32 ( ior --> ior 32 )
  <> ( ior 32 --> flag )
ELSE ( fileid 0 0 --> fileid 0 )
  \ если ior OPEN-FILE-SHARED = 0
  \ т.е. файл нормально открылся
  DROP ( fileid 0 --> fileid )
  CLOSE-FILE ( fileid --> ior )
  \ А ниже мне непонятно, что для THROW
  \ на стеке должно быть и что останется,
  \ на стеке когда THROW отработает?
  THROW
  TRUE
THEN



За это сообщение автора registration поблагодарил: ctrl-C
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Пт мар 11, 2011 18:38 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4840
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 52 раз.
registration писал(а):
1. Перед IF на стеке отсутствует результат операции сравнения ( flag ). В IF входим со значением ior оставшимся от OPEN-FILE-SHARED
Вопрос: это и будет, в данном случае, flag для IF?

да, в Форте IF реагирует на 0, либо на отличное от него значение, а флаги
TRUE = -1
FALSE = 0.
Т.е. не так как в Си или Паскале!!! Впрочем, я это уже описывал.

registration писал(а):
2. Мне непонятно, что для THROW на стеке должно быть и что останется, на стеке когда THROW отработает?

опять же уже было описано и CATCH и THROW
чуть позже продолжу

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur



За это сообщение автора mOleg поблагодарили - 2: ctrl-C, registration
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Пт мар 11, 2011 20:01 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4840
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 52 раз.
итак, по коду:
registration писал(а):
CLOSE-FILE ( fileid --> ior )
\ А ниже мне непонятно, что для THROW
\ на стеке должно быть и что останется,
\ на стеке когда THROW отработает?
THROW

THROW снимает с вершины стека число, если оно отлично от нуля, выполняется код, вызывающий исключение, если нуль - управление передается коду, расположеному за THROW.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur



За это сообщение автора mOleg поблагодарил: ctrl-C
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Чт июл 21, 2011 04:11 
Очень похожая ситуация. Пресловутый usb.wsf создан на сетевом диске одной из рабочих станций. Все WS обходить - долгая песня (хотя, видимо, придется). А работать мешает. Может есть возможность определить в чьем реестре он прописан?
Ответ, если можно, по E-mail: 696944.110@mail.ru
Заранее спасибо.
Алексей Кашкаров


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Чт июл 21, 2011 04:17 
Забыл добавить, что сеть Microsoft без домена


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Вт ноя 01, 2011 14:31 
Не в сети

Зарегистрирован: Ср окт 19, 2011 22:15
Сообщения: 1
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Если тема еще актуальна, то позвольте, как говорится, сказать:
registration писал(а):
Код:
    FOUND-FULLPATH R/W OPEN-FILE-SHARED
    GetLastError
    32 <> \ 32 -код ошибки ERROR_SHARING_VIOLATION
  UNTIL
CLOSE-FILE DROP


Здесь не совсем так. В документации крона вообще ничего не сказано о слове OPEN-FILE-SHARED. Но из приведенного там примера можно сделать вывод, что оно возвращает дескриптор файла (FID), открытого для немонопольного доступа. Там же этот дескрипттор присваивается переменной. А слово CLOSE-FILE используется соответствоенно с этим же дескриптором (или fileID). Т.е. не хватает переменной для дискриптора, открывающего и закрывающего файл. (отсюда, видимо, и проблема стека, т.к. слово возвращает дискриптор)
В кроне так:
Код:
S" test.txt" R/O OPEN-FILE-SHARED THROW list-file !   \ заносим ID файла в переменную, чтобы иметь возможность с ним работать для записи, чтения и пр.
Далее
list-file @ CLOSE-FILE DROP    \ закрываем файл по его ID

Вот. Ну и еще несколько замечаний:
Если открывать файл словом OPEN-FILE-SHARED, то каким образом мы увидим, что он занят? Т.е. он может быть занят занят процессом, но не монопольно, т.е. мы не поймем, можно ли его перемещать собственно? Вот если его открыть словом OPEN-FILE (т.е. использовать монопольный доступ), то, отловив ошибку, поймем, что файл уже занят. И, поняв, что он занят, сделаем паузу, проверим еще раз и т.д. пока не освободится.
Ну вот как то так, как я думаю.
Но и это решение выглядит как то костыляво. Вот если через winAPI как-нибудь... Но эта тема для меня темный лес. Однако такая простенькая прога Unlocker показывает все процессы, которые работают с файлом и даже может их легко разблокировать. Не знаю, сделано ли в ней средствами системы или как то другим способом.



За это сообщение автора Сергей_К поблагодарил: ctrl-C
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Как определить что "файл занят другим процессом"?
СообщениеДобавлено: Вт ноя 01, 2011 17:44 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1252
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Сергей_К писал(а):
Но и это решение выглядит как то костыляво. Вот если через winAPI как-нибудь...

Открыть файл на запись и есть самый простой способ узнать, открыт ли файл на запись другим процессом или нет. Если ошибка - либо файл не существует либо уже открыт на запись. Можно конечно через недокументированные функции добраться до списка хэндлов всех открытых файлов и искать там нужный файл - но это уже будет не так тривиально и просто.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc



За это сообщение автора VoidVolker поблагодарил: ctrl-C
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB