Just for anyone referencing this topic, there's more information on our here:
If you aren't writing on the front-end boxes than you could remove the writers but that probably isn't going to help you much as the writers do not keep an open lock on the indexes (in the future they might though). The searchers do keep an open lock on the indexes once search has initiated. Here's a zany trick that might work though this is something un-tested, unsupported may cause threading issues, etc... but you can try :)
You can get a reference to your provider like:
var provider = (LuceneSearcher) ExamineManager.Instance.SearchProviderCollection["myIndex"];
You can close the reader which will remove the lock - though if there's currently a search taking place, this reader may be instantly re-opened again.
var indexSearcher = (IndexSearcher) provider.GetSearcher();
var indexReader = indexSearcher.GetIndexReader();
indexSearcher.Close();
indexReader.Close();
The only issue with the your implementation is that the media cache that is in examine is referenced directly by the Examine provider name "InternalSearcher" so unless you can get that specific provider configured to use your custom folder the media will not be coming from the Examine cache,or it will be coming from a stale Examine cache.
Examine v2 will let you initialize all examine providers via code (without config) so you can dynamically re-configure them on startup. I'm not sure how often you are shipping your Examine backups to your servers? Could you potentially just update the Examine config file in code to point to your new folder? This will restart the app pool and Examine would then be configured with the newer up-to-date folder.
Otherwise without restarting the app pool, changing a folder at runtime for the provider's IndexReader would be an interesting challenge and might actually be possible if you implement your own provider by inheriting from the default one. In your own provider you could detect somehow that a new snapshot folder is available, when it is you could attempt to close the current reader. Then the next time a search takes place the code will automatically try to re-create the reader and then you can override the method GetLuceneDirectory() to return the new folder. You can see how this works by looking here:
https://github.com/Shandem/Examine/blob/master/Projects/Examine/LuceneEngine/Providers/LuceneSearcher.cs in the method: ValidateSearcher when ReaderStatus.Closed.
There is a parameter overload for ValidateSearcher to forceReopen but unfortunately that doesn't ever get used.
Let me know if that helps at all!