Today we’ll do a scripting version of an old C++ program: Printing information about the items in the Recycle Bin. (How you wish to act on the information is up to you.)
This is a pattern we’ve seen a lot. Bind to a folder, enumerate its contents, extract properties.
var shell = new ActiveXObject("Shell.Application");
var recycleBin = shell.NameSpace(10); // CSIDL_BITBUCKET
var items = recycleBin.Items();
for (var i = 0; i < items.Count; i++) {
var item = items.Item(i);
WScript.StdOut.WriteLine(item.Name);
WScript.StdOut.WriteLine(item.ExtendedProperty(
"System.Recycle.DeletedFrom"));
WScript.StdOut.WriteLine(item.ExtendedProperty(
"System.Recycle.DateDeleted"));
WScript.StdOut.WriteLine(item.Size);
}
Wow, that was way easier than doing it in C++!
Just for fun, I’ll do it in C#, first as a straight port:
// add a reference to shell32.dll
class Program {
public static void Main()
{
var shell = new Shell32.Shell();
var recycleBin = shell.NameSpace(10); // CSIDL_BITBUCKET
var items = recycleBin.Items();
for (var i = 0; i < items.Count; i++) {
var item = (Shell32.FolderItem2)items.Item(i);
System.Console.WriteLine(item.Name);
System.Console.WriteLine(item.ExtendedProperty(
"System.Recycle.DeletedFrom"));
System.Console.WriteLine(item.ExtendedProperty(
"System.Recycle.DateDeleted"));
System.Console.WriteLine(item.Size);
}
}
}
We have to cast to
Shell32.FolderItem2 because the default interface
for the Item() method is
Shell32.FolderItem,
but
ExtendedProperty is a method on
Shell32.FolderItem2.
We didn’t have to do this explicit cast in JavaScript
because JavaScript is a dynamically-typed language.
So let’s use the dynamic keyword to mimic that
in C#.
Note, however, that if you use dynamic, then you
miss out on a lot of IntelliSense features.
class Program {
public static void Main()
{
var shell = new Shell32.Shell();
var recycleBin = shell.NameSpace(10); // CSIDL_BITBUCKET
var items = recycleBin.Items();
foreach (dynamic item in items) {
System.Console.WriteLine(item.Name);
System.Console.WriteLine(item.ExtendedProperty(
"System.Recycle.DeletedFrom"));
System.Console.WriteLine(item.ExtendedProperty(
"System.Recycle.DateDeleted"));
System.Console.WriteLine(item.Size);
}
}
}
Now you can do things like list all the files deleted today
class Program {
public static void Main()
{
var today = DateTime.Today;
var shell = new Shell32.Shell();
var recycleBin = shell.NameSpace(10); // CSIDL_BITBUCKET
var items = recycleBin.Items();
foreach (dynamic item in items) {
if (item.ExtendedProperty("System.Recycle.DateDeleted").Date
== today) {
System.Console.WriteLine(item.name);
}
}
}
}
0 comments