Mam napęd z obsługą kwot i chcę usunąć wszystkie pliki utworzone przez określonego użytkownika (w rzeczywistości zestaw aplikacji uruchamianych przy użyciu specjalnego konta) z tego dysku. Jak mogę to zrobić bez rekursywnego sprawdzania wszystkich plików i folderów na HDD, czy jest tworzony przez określonego użytkownika czy nie? Potrzebuję tylko "iteratora".Usuń wszystkie pliki utworzone przez określonego użytkownika
Odpowiedz
spojrzeć na poniższym przykładzie
[Test]
public void Test()
{
string user = @"Domain\UserName";
var files = Directory.EnumerateFiles(@"C:\TestFolder")
.Where(x => IsOwner(x, user));
Parallel.ForEach(files, File.Delete);
}
private static bool IsOwner(string filePath, string user)
{
return string.Equals(File.GetAccessControl(filePath).GetOwner(typeof (NTAccount)).Value, user,
StringComparison.OrdinalIgnoreCase);
}
Hmm, wygląda na to, że nie ma sposobu na uzyskanie tej listy bez iteracji każdego pliku na dysku twardym. ok dzięki) – Alexus
Jeśli chodzi o poprawę wydajności, myślę, że przy użyciu algorytmu rekursywnego do wyszukiwania plików i folderów można użyć biblioteki zadań.
Innym sposobem, można zrobić Lucence było korzystne ramy dla wyszukiwania i została już opublikowana wersja dla .NET
TPL i IO - nie SSD? Dla wielu plików wyniki będą znacznie gorsze niż bez TPL ... –
Właściwie można to zrobić iteracyjnie i efektywnie przy użyciu USN Change Journal, patrz http://msdn.microsoft.com/en-us/library/windows/desktop/aa363798.aspx. Właściwe korzystanie z filtrowania pozwala uzyskać listę plików utworzonych przez określonego użytkownika w określonym czasie.
Z drugiej strony ta technika jest dość skomplikowana i nadaje się do zastosowań o krytycznym czasie; jeśli efektywność nie jest centralnym punktem twojej aplikacji, wybrałbym prostsze rozwiązanie.
Czy masz na myśli właściciela pliku *? –
Programowo wierzę, że trzeba powtórzyć wszystkie pliki sterownika. Być może mógłbyś poruszyć to pytanie do serwera serverfault, aby sprawdzić, czy ludzie mogą ci pomóc lepiej. –