![]() |
Desktop Development »
Shell and IE programming »
Shell Programming
Intermediate
License: The Common Public License Version 1.0 (CPL)
Notifying Windows Explorer about files in useBy Lukasz SwiatkowskiHow to notify Windows Explorer about which files are used and locked by your application. |
C# (C# 2.0, C# 3.0), Windows (Win2K, WinXP, Win2003, Vista, TabletPC), .NET (.NET 2.0, .NET 3.0, .NET 3.5), Win32, COM, Dev
|
||||||||||
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
While doing some files-related operations like renaming, moving or deleting, many of you might encounter this kind of message:

This is the standard way Windows Explorer notifies the user that some file is in use, and therefore it cannot be “changed” in any way (that is renamed, moved, deleted, etc.)
Of course there is the way for an application to notify Windows Explorer about which files are in use. For example Microsoft Office applications do that. When Windows Explorer is notified, the message saying that the file is in use looks different:

This article explains how to write an application which notifies Windows Explorer about used files.
The easiest way for a developer is to implement a COM interface named IFileIsInUse[^]. Unfortunately, this interface is available only in Windows Vista. Luckily, there is another way. I show an example demonstrating what Windows Explorer (e.g. in Windows XP) does when the user tries to delete a file which is in use. In the following example an entry abc=“123” will mean that the default value of the abc registry key has to be equal to 123.
Dictionary<String, ComObject> (of course it is not, because it is not a .NET object). IOleObject interface. GetUserClassID(ref Guid userClassId) method. Let's assume that the method assigns a {abcdef12-ca3b-a654-e640-bf50b3aba521} GUID to the userClassId parameter. HKCR\CLSID\{abcdef12-ca3b-a654-e640-bf50b3aba521}\ProgID=“ApplicationName”HKCR\ApplicationName\CLSID=“{abcdef12-ca3b-a654-e640-bf50b3aba521}”HKCR\ApplicationName\shell\Open\command=“path to the application exe file” AssemblyTitle attribute.If everything was OK, Windows Explorer shows a message box (like the second one from this article) with the name of the application.
I have created a FileLocker class which provides methods to notify Windows Explorer, which files are currently used by the application. The class implements the IDisposable interface, so it can be comfortably used with the using keyword. The sample usage is shown on the following code:
// GUID, which must be unique, used to register an application in the registry
[assembly: Guid("{abcdef12-ca3b-a654-e640-bf50b3aba521}")]
// Application title which will be shown by the Windows Explorer
[assembly: AssemblyTitle("FileLockerApplication")]
...
// registers the application in the registry
FileLocker.Register();
string path = "some_file.txt";
// creates or opens the file and locks it
using (FileStream fs = File.Open(path, FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.None))
// notifies Windows Explorer that the file is in use
using (FileLocker fl = new FileLocker(path))
{
// here might be some code
}
// deletes the file
File.Delete(path);
// unregisters the application from the registry
FileLocker.Unregister();
The appropriate keys in the registry are created by the FileLocker.Register() method, and deleted by the FileLocker.Unregister() method. They require a permission to write to the registry, so it is best to invoke them from the application during installation/uininstallation process. To successfully register there is also needed a Guid attribute applied to the assembly.
void Register() — Registers the FileLocker. Invoke it from the application during the installation process.void Unregister() — Unregisters the FileLocker. Invoke it from the application during the uninstallation process.FileLocker(FileInfo fileInfo) & FileLocker(string path) — Initializes a new instance of the FileLocker class and notifies Windows Explorer that the specified file is currently used by the application. void Dispose() — Cancels the notification and disposes the object.| You must Sign In to use this message board. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 18 Sep 2008 Editor: |
Copyright 2008 by Lukasz Swiatkowski Everything else Copyright © CodeProject, 1999-2009 Web10 | Advertise on the Code Project |