You can't - not like that.
The problem is that SearchOption.AllDirectories always returns system "files" which normal code will not have access to - the volume info, and the recycle bin for example. (This applies to DirectoryInfo.GetFiles as well).
If you really need to search all files starting from the root of any drive, then do the root itself first (by excluding AllDirectories) and then call GetFiles with AllDirectories on all of the subdirectories in the root in turn. Nasty, but it's pretty much the only way I know of to do it.
[edit]
Dug this out of some old code:
public static string[] GetAllSafeFiles(string path, string searchPattern = "*.*")
{
List<string> allFiles = new List<string>();
string[] root = Directory.GetFiles(path, searchPattern);
allFiles.AddRange(root);
string[] folders = Directory.GetDirectories(path);
foreach (string folder in folders)
{
try
{
if (!IsIgnorable(folder))
{
allFiles.AddRange(Directory.GetFiles(folder, searchPattern, SearchOption.AllDirectories));
}
}
catch {}
}
return allFiles.ToArray();
}
private static bool IsIgnorable(string dir)
{
if (dir.EndsWith("System Volume Information")) return true;
if (dir.Contains("$RECYCLE.BIN")) return true;
return false;
}
It's what I use to do that job.
[/edit]