2012-08-10 26 views
5

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

+0

Czy masz na myśli właściciela pliku *? –

+0

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. –

Odpowiedz

2

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); 
    } 
+0

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

1

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

+0

TPL i IO - nie SSD? Dla wielu plików wyniki będą znacznie gorsze niż bez TPL ... –

1

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.