2012-12-03 16 views
6

C'è un modo semplice per rilevare se un file viene aperto in qualsiasi processo in Windows?Qual è un modo programmatico per rilevare se un file viene aperto in Windows?

Ad esempio, sto monitorando una directory e se i file vengono inseriti nella directory, voglio eseguire alcune azioni su questi file.

Non voglio eseguire queste azioni, se i file vengono ancora copiati nella directory o se il contenuto di questi file è ancora in fase di aggiornamento.

Quindi, quello che sta succedendo è che dato un nome di file, voglio implementare una funzione, come la funzione IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Boolean, che restituisce true o false.

Uno dei modi che posso pensare, è quella di rinominare il file, e se la ridenominazione ha esito positivo, nessun altro processo hanno aperto il file che mi interessa, in questo modo:

function IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Boolean; 
begin 
    Result := not (MoveFileEx(PathName, PathName+'.BLAH', 0) and MoveFileEx(PathName+'.BLAH', PathName, 0)); 
end; 

La logica se posso rinominare il file (in un'altra estensione), rinominarlo nuovamente, non viene aperto da nessun altro processo (al momento del controllo).

Grazie.

+0

Stai usando C++, C#? –

risposta

8
IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Boolean 

Questa è una funzione che non è possibile implementare correttamente in un sistema operativo multitasking. Otterrai un falso ritorno e un nanosecondo dopo un altro processo apre il file e rovina la giornata.

L'unico modo per farlo correttamente è farlo atomicamente, in realtà tentando di aprire il file. E non specificare alcuna condivisione in modo che nessun altro processo possa aprire il file. Ciò fallirà con ERROR_SHARING_VIOLATION se un altro processo ha già ottenuto l'accesso al file. A quel punto dovrai aspettare un po 'e riprovare più tardi.

+0

Una risposta davvero bella Hans e una che risparmierò più tardi = D – garfbradaz

+0

@ hans-passant, come viene aperto un file che specifica la condivisione? Sto usando la funzione '_findfirst', ma la pagina MSDN non menziona la condivisione come con i file nascosti (ad esempio) [https://msdn.microsoft.com/en-us/library/kda16keh.aspx] –

+0

Quella funzione si limita a localizzare i file, non li apre. Usa CreateFile o _fsopen. –

Problemi correlati