我試圖搜索系統上所有捲上的特定文件名,系統卷信息或Windows目錄除外,併爲每個文件打印出每個完整路徑。搜索目錄中的特定文件名
我試着使用Directory.GetFiles
,但它只能搜索器驅動器C內:\或驅動器d:\(取決於定,哪些驅動器)
我如何能實現我的目標是什麼?
例如我想運行的程序和搜索名爲「.DS_Store」文件(用於使用MAC,現在我的文件系統已滿這些文件的....)
我會很感激任何幫助。 謝謝您提前
UPD。方案應具有管理員權限執行工作
我試圖搜索系統上所有捲上的特定文件名,系統卷信息或Windows目錄除外,併爲每個文件打印出每個完整路徑。搜索目錄中的特定文件名
我試着使用Directory.GetFiles
,但它只能搜索器驅動器C內:\或驅動器d:\(取決於定,哪些驅動器)
我如何能實現我的目標是什麼?
例如我想運行的程序和搜索名爲「.DS_Store」文件(用於使用MAC,現在我的文件系統已滿這些文件的....)
我會很感激任何幫助。 謝謝您提前
UPD。方案應具有管理員權限執行工作
作爲cryptolocker分析的一部分,我寫的定位目標擴展的原型,在這裏是如何使用它
var cmd = new LocateTargetFilesCommand();
cmd.Execute()
它會搜索h兩個擴展的所有驅動器:.xlsx
和.doc
。最大的問題是處理權限問題。此外,子文件夾可能擁有更廣泛的權限,因此如果您無法訪問父文件夾,仍然可以訪問其根目錄。
最後,cmd.FoundTargets
將包含找到的文件的絕對路徑與所需的擴展
public class LocateTargetFilesCommand
{
private string[] _targetExtensions = new[]
{
"xlsx", "doc"
};
public LocateTargetFilesCommand()
{
FoundTargets = new ConcurrentQueue<string>();
DirsToSearch = new List<string>();
}
public ConcurrentQueue<string> FoundTargets { get; private set; }
public List<string> DirsToSearch { get; private set; }
public void Execute()
{
DriveInfo[] driveInfos = DriveInfo.GetDrives();
Console.WriteLine("Start searching");
foreach (var driveInfo in driveInfos)
{
if (!driveInfo.IsReady)
continue;
Console.WriteLine("Locating directories for drive: " + driveInfo.RootDirectory);
GetAllDirs(driveInfo.RootDirectory.ToString());
Console.WriteLine("Found {0} folders", DirsToSearch.Count);
foreach (var ext in _targetExtensions)
{
Console.WriteLine("Searching for .*" + ext);
int currentNotificationProgress = 0;
for (int i = 0; i < DirsToSearch.Count; i++)
{
int progressPercentage = (i * 100)/DirsToSearch.Count;
if (progressPercentage != 0)
{
if (progressPercentage % 10 == 0 && currentNotificationProgress != progressPercentage)
{
Console.WriteLine("Completed {0}%", progressPercentage);
currentNotificationProgress = progressPercentage;
}
}
var dir = DirsToSearch[i];
try
{
string[] files = Directory.GetFiles(dir, "*." + ext, SearchOption.TopDirectoryOnly);
foreach (var file in files)
{
FoundTargets.Enqueue(file);
}
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine("Skipping directory: {0}", dir);
DirsToSearch.Remove(dir);
}
}
Console.WriteLine("So far located {0} targets", FoundTargets.Count);
}
DirsToSearch.Clear();
}
Console.WriteLine("Stop searching");
}
public void GetAllDirs(string root)
{
try
{
string[] dirs = Directory.GetDirectories(root);
DirsToSearch.AddRange(dirs);
foreach (var dir in dirs)
{
GetAllDirs(dir);
}
}
catch (UnauthorizedAccessException)
{
//swallow
}
}
}
foreach (var d in Directory.GetLogicalDrives())
{
var files = Directory.GetFiles(d, file);
}
試試這個:
foreach (var drive in Directory.GetLogicalDrives())
{
foreach (var fileInfo in from dir in Directory.GetDirectories(drive) from file in Directory.GetFiles(dir) select new FileInfo(file))
{
// get all details in fileInfo
}
}
THX到奧萊克西,但這裏是我如何使用這個代碼排除所有系統目錄
public class LocateTargetFilesCommand
{
private string[] _targetExtensions = new[]
{
".DS_Store"
};
public LocateTargetFilesCommand()
{
FoundTargets = new ConcurrentQueue<string>();
DirsToSearch = new List<string>();
}
public ConcurrentQueue<string> FoundTargets { get; private set; }
public List<string> DirsToSearch { get; private set; }
public void Execute()
{
DriveInfo[] driveInfos = DriveInfo.GetDrives();
Console.WriteLine("Start searching");
foreach (var driveInfo in driveInfos)
{
if (!driveInfo.IsReady)
continue;
Console.WriteLine("Locating directories for drive: " + driveInfo.RootDirectory);
GetAllDirs(driveInfo.RootDirectory.ToString());
Console.WriteLine("Found {0} folders", DirsToSearch.Count);
foreach (var ext in _targetExtensions)
{
Console.WriteLine("Searching for " + ext);
int currentNotificationProgress = 0;
for (int i = 0; i < DirsToSearch.Count; i++)
{
int progressPercentage = (i * 100)/DirsToSearch.Count;
if (progressPercentage != 0)
{
if (progressPercentage % 10 == 0 && currentNotificationProgress != progressPercentage)
{
Console.WriteLine("Completed {0}%", progressPercentage);
currentNotificationProgress = progressPercentage;
}
}
var dir = DirsToSearch[i];
try
{
string[] files = Directory.GetFiles(dir, ext, SearchOption.TopDirectoryOnly);
foreach (var file in files)
{
FoundTargets.Enqueue(file);
}
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine("Skipping directory: {0}", dir);
DirsToSearch.Remove(dir);
}
}
Console.WriteLine("So far located {0} targets", FoundTargets.Count);
}
DirsToSearch.Clear();
}
Console.WriteLine("Stop searching");
}
public void GetAllDirs(string root)
{
try
{
string[] dirs = Directory.GetDirectories(root);
DirsToSearch.AddRange(dirs);
foreach (var dir in dirs)
{ if(dir.Contains("Windows"))
Console.WriteLine("Skipped Windows Directory");
else if (dir.Contains("Users"))
Console.WriteLine("Skipped Users Directory");
else if (dir.Contains("MSOCache"))
Console.WriteLine("Skipped MSOCache Directory");
else if (dir.Contains("SYSTEM.SAV"))
Console.WriteLine("Skipped SYSTEM.SAV Directory");
else if (dir.Contains("ProgramData"))
Console.WriteLine("Skipped ProgramData Directory");
else if (dir.Contains("System Volume Information"))
Console.WriteLine("Skipped System Volume Information Directory");
else if (dir.Contains("$SysReset"))
Console.WriteLine("Skipped $SysReset Directory");
else
GetAllDirs(dir);
}
}
catch (UnauthorizedAccessException)
{
}
}
你可以[獲取驅動器列表](http://msdn.microsoft.com/library/system.io.driveinfo.getdrives),但你真正的問題將是訪問權 – Sayse
這就是爲什麼我說即時消息不會acc ess Windows或其他系統目錄(程序應該以管理員權限執行) –