7
votes

Fermer les fichiers ouverts en utilisant c #

J'ai une situation où les gens sont connectés à des fichiers sur une part et que cela me bloque d'écraser le fichier. J'essaie d'écrire une méthode qui cherchera à voir si un filépathe que je fournis est actuellement verrouillé de cette manière et fermez la session réseau de cette ressource.

J'ai regardé le fournisseur de Winnt ADSI, mais le membre Resources.ReMove n'est pas implémenté. Ensuite, j'ai regardé Win32_Serversession et pendant que je suis capable d'utiliser Supprimer membre, il tue toutes les ressources pour un utilisateur donné. Je dois savoir comment être plus précis.

Je fais de la marche GetReleShips et des propriétés mais je suis juste coupé pour le moment.


3 commentaires

Je n'ai aucune idée si vous pouvez même le faire - et si vous le pouvez, c'est sage? Alternative - Pouvez-vous envoyer un message à l'utilisateur en quelque sorte - email, via l'application, etc.?


Salut chris. À mon avis, le déploiement automatiquement au-dessus des fichiers de ressources en lecture / écriture sur un réseau est toujours faux. Le seul cas que je ferais, c'est si les fichiers eux-mêmes sont tous en lecture seule par conception - mais à nouveau comme des développeurs d'installation, nous sommes toujours confrontés à la mentalité "juste le faire". J'ai mis en place un vérificateur pour écrit aux fichiers d'un partage réseau utilisant C # et FileSystemwatcher. Cela n'a jamais fonctionné car les événements soulevés sont différents selon le matériel de sous-couche. Voici quelques détails: codeProject.com/kb/files/...


En fait, cette question n'avait rien à voir avec le déploiement / la configuration. C'était une situation dans laquelle une construction automatisée essayait d'archiver à un dossier connu et qu'il y avait des fichiers verrouillés qui se trouvaient dans la voie.


3 Réponses :


1
votes

Il serait difficile de considérer toutes les ramifications de le faire car vous ne pouvez pas nécessairement prédire le comportement résultant de l'application qui a actuellement le fichier verrouillé.

Y a-t-il une autre façon de faire cela? Par exemple, devez-vous remplacer le fichier immédiatement ou avoir un processus externe qui essaiera continuellement à écraser le fichier toutes les quelques minutes jusqu'à ce qu'il réussisse?


1 commentaires

Je vais vous donner le "ne fais pas ça". :-) Je sais que je n'ai pas donné les raisons pour lesquelles j'ai besoin de le faire, mais ils étaient réels. Fortunatly j'ai remis la tâche à quelqu'un d'autre. :-)



1
votes

J'ai fait face au même problème. Jusqu'à présent, je sais que la seule façon de le faire, utilise le Win32API:

[DllImport("Netapi32.dll", SetLastError=true, CharSet = CharSet.Unicode)]
public static extern int NetFileClose(string servername, int id);


0 commentaires

1
votes

Vous pouvez utiliser le code que vous fournissez le chemin d'accès complet à la liste de fichiers et de renvoyer une liste code> de n'importe quoi verrouillage de ce fichier:

public static void remoteProcessKill(string computerName, string fullUserName, string pword, string processName)
{
    var connectoptions = new ConnectionOptions();
    connectoptions.Username = fullUserName;  // @"YourDomainName\UserName";
    connectoptions.Password = pword;

    ManagementScope scope = new ManagementScope(@"\\" + computerName + @"\root\cimv2", connectoptions);

    // WMI query
    var query = new SelectQuery("select * from Win32_process where name = '" + processName + "'");

    using (var searcher = new ManagementObjectSearcher(scope, query))
    {
        foreach (ManagementObject process in searcher.Get()) 
        {
            process.InvokeMethod("Terminate", null);
            process.Dispose();
        }
    }
}


0 commentaires