2009-09-11 6 views
0

Je zippe des fichiers dans un dossier en utilisant les bibliothèques DotNetZip. Pour identifier les fichiers actuellement ouverts par d'autres processus, j'utilise 'handle.exe' de SysInternals.com. Je fais ceci en l'appelant avec des paramètres et en analysant la sortie, le long de ces lignes.Identification des poignées de processus et des verrous sur les fichiers du code managé

using (Process handleProcess = new Process()) 
{ 
    // -- Set up the parameters and call the process. 
    handleProcess.StartInfo.FileName = "handle.exe"; 
    handleProcess.StartInfo.UseShellExecute = false; 
    handleProcess.StartInfo.RedirectStandardOutput = true; 
    handleProcess.StartInfo.Arguments = "-u " + fileName; 
    handleProcess.Start(); 
... 

Qui fonctionne mais a l'air d'un kludge à ce sujet. Quelqu'un peut-il suggérer une meilleure approche dans le code managé?

Répondre

0

See the answers in a similar question asked on SO. Dans une autre question using interop was suggested (et quelqu'un d'autre a suggéré SysInternals ainsi).

Peu importe ce que vous faites, vous devez avoir une nouvelle tentative. J'ai écrit des adapteurs auparavant qui ont dû réessayer. La logique de réessai elle-même a été encapsulée dans une classe RetryTracker avec des sous-classes pour différents algorithmes (par exemple, retard linéaire, retard progressif, etc.).

1

Le code suivant vous montre les fichiers ouverts par d'autres processus:

SelectQuery query = new SelectQuery("select name from cim_datafile"); 
using (ManagementObjectSearcher searcher = new 
ManagementObjectSearcher(query)) 
{ 
    foreach (ManagementObject mo in searcher.Get()) 
    { 
     Console.WriteLine("File Name: {0} \nIs currently opened", mo.Properties["Name"].Value); 
    } 
} 

Il est une version légèrement modifiée de this.

Questions connexes