Newsgroup: it.comp.programmare.win32
Titolo: Come è stato aperto un file ?

Vi porpongo questo quesito:
supponiamo che io tenti di aprire un file in modalità esclusiva.
supponiamo anche che non riesca ad aprirlo perché è già stato aperto da un
altro processo.
Si è verificata quindi uno dei seguenti casi:
1) Non ho aperto il file in modalità esclusiva perché è già aperto in
modalità esclusiva da un altro processo.
2) Non ho aperto il file in modalità esclusiva perché è già aperto in
modalità shared da almeno un altro processo.
Posso riuscire a sapere quale dei due casi si è verificato ?
Ciao e grazie anticipatamente.
Porlock.


Riprovare ad aprirlo shared e vedere cosa ritorna l'handle? A questo
punto sai se e' aperto in modalita' esclusiva o condivisa.
Ciao.
Il Michett@
--

 Ciao.
Piů che giusto dieri.
Grazie per il suggerimento.
Ciao.
Porlock.

 Più che giusto dieri.
Pero` cosi` l'operazione non e` "atomica", fra il test e la successiva
apertura potrebbe esserci un altro processo che torna ad aprire il file.
Ho avuto anche io questo problema, avevo anche cercato un modo per
cambiare "al volo" la modalita` di condivisione di un file senza
chiuderlo e riaprirlo ma alla fine ho rinunciato.
---
Bye! Lorenzo Lutti
http://www.geocities.com/SiliconValley/Peaks/6258/

 chiuderlo e riaprirlo ma alla fine ho rinunciato.
Hai provato con un thread worker che controlli l'aggiornamento del
filesystem con FindFirstChangeNotification() seguito da
WaitForMultipleObjects()? In questo modo sai se al tuo rilascio
qualcuno "allunga le mani" sul file. Guardati "Monitoring Changes
in a Directory or Directory Tree" sul Platform SDK. C'e un'esempio
di monitoring multiplo di directory.
In alternativa su WinNT/2K puoi usare ReadDirectoryChangesW() che
chiama una callback (FileIOCompletionRoutine) quando si verificano
determinati cambiamenti (es FILE_NOTIFY_CHANGE_LAST_ACCESS).
Come ultima spiaggia spari il processo ad una priorita' tale che
gli altri restano a guardare. Per la serie il file e' MIIIOOOO! :^)
Ciao.
Il Michett@
--

 MIIIOOOO! :^)
Non e` una brutta idea... :)


 cio` di cui parlo, ma non la ricordo piu`.
Be' direi che l'utilizzo di chmod e' piu' che sufficente.... ;)
A parte gli scherzi penso che su Unix (linux in particolare) se non crei
un semaforo che controlli l'accesso al filesystem da parte degli altri
processi non penso possa pensare di rilasciarlo e sperare che  nessuno vi
accedi (Alan Cox). Si puo' provare con flock() ma temo che vada in crisi
anche
questo se metti caso ci siano due processi che tentano l'accesso a un
filesystem remoto (come nel caso di un server). Comunque resta sempre un
"advisory lock" se gli altri procesi non rispettano le regole di accesso
(verifica del file descriptor) non serve a niente. Tra l'altro l'utilizzo
di flock non e' univoco su tutti gli OS unix-like. Su Linux il lock e'
thread based, POSIX e' process based...con i casini che possono scaturire!
Unix non ha un vero sistema per bloccare l'accesso ai file (a parte i
permessi user, group, owner). In alternativa si puo' usare il "mandatory
lock" che consiste nell'aprire, lockare e rinominare il file. Non e' il
massimo.
Questo e' quello che so' in materia ma potrebbero esserci altre strade.
Chissa....
Ciao.
Il Michett@
--