Вы можете попробовать следующее:
$srcroot = "c:\temp\sourcedirectory"
$builroot= "c:\temp\targetdirectory"
gci -path $srcroot -filter $filepattern -recurse |
% { Copy-Item $_.FullName -destination ($_.FullName -replace [regex]::escape($srcroot),$builroot) }
Ой, это будет сложно сделать из управляемого кода.
В кодепероке
Handle - отличная программа, и ссылка на codeproject хороша.
@Brian Причиной для кода является то, что handle.exe НЕ распространяется. Они также не выпускают свой источник.
Похоже, что .Net не будет легко делать это, так как кажется, что для доступа к информации требуется встроенный накопитель. Это невозможно сделать в .net без неиспользуемой DLL. Это относительный глубокий код ядра по сравнению с типичным кодированием .net. Я удивлен, что WMI не раскрывает этого.
Возможно, используя инструмент командной строки:
OpenedFilesView v1.50 - просмотр открытых / заблокированных файлов в вашей системе (проблемы с нарушениями доступа)
Посмотрите этот файл: http://vmccontroller.codeplex.com/SourceControl/changeset/view/47386#195318
И используйте:
DetectOpenFiles.GetOpenFilesEnumerator(processID);
Демо:
using System;
using System.Diagnostics;
namespace OpenFiles
{
class Program
{
static void Main(string[] args)
{
using (var openFiles = VmcController.Services.DetectOpenFiles.GetOpenFilesEnumerator(Process.GetCurrentProcess().Id))
{
while (openFiles.MoveNext())
{
Console.WriteLine(openFiles.Current);
}
}
Console.WriteLine();
Console.ReadKey();
}
}
}
Он имеет зависимость от сборки System.EnterpriseServices
Вы можете P / INVOKE в функцию NtQuerySystemInformation
запросить все дескрипторы, а затем перейти оттуда. Это обсуждение групп Google содержит сведения.
Взгляните на версию [h0] процесса хакера wj32 , которая может делать то, что вы просили, и многое другое.