2010-08-19 8 views
12

J'ai trouvé une question similaire here mais elle a été fermée/acceptée avec une réponse de "ne fais pas ça".Forçage fermé un fichier ouvert par C#

Je suis dans une situation où je me fiche de ce qui arrive aux autres applications, je veux prendre un fichier qui peut être verrouillé par d'autres (grossièrement si nécessaire) et faire mon chemin avec elle. Il se peut que je doive déplacer, renommer ou supprimer ce fichier.

Fondamentalement, j'ai besoin de traiter les fichiers dans un répertoire qui est créé par une application qui ne nettoie pas ses verrous. Je sais que l'application est en cours de traitement lorsque le mien appelle, mais je dois tuer les verrous quand je cours. En outre, il semble que je suis en conflit avec les lectures du logiciel AV local balayant le partage distant où se trouve le serveur.

Tout cela ajoute à une situation de "force close" insoluble afin que je puisse faire ce dont j'ai besoin. Est-ce que quelqu'un a une idée sur ce qu'il faut faire?

Répondre

2

Cette est probablement hors de propos et si c'est quelqu'un s'il vous plaît commentaire, mais il y avait un travail autour de l'explorateur que j'ai utilisé auparavant pour contourner les verrous de fichiers.
Si un fichier était bloqué par un processus qui était mort, Windows ne vous permettait pas souvent de le supprimer mais si vous créiez un nouveau fichier du même nom ailleurs, le déplaciez dans le dossier où il aboutirait. Vous pourriez alors supprimer le nouveau fichier et tout allait bien.
Pour l'utiliser pour votre application, vous devez être capable de lire le fichier et le garder en mémoire avant de le faire, puis vous l'écrivez après vous être débarrassé de l'ancien.
Peut-être que cela aidera, peut-être pas, mais ça vaut le coup d'essayer.

0
foreach (var process in Process.GetProcessesByName("excel")) //whatever you need to close 
    { 
     if (process.MainWindowTitle.Contains("test.xlsx")) 
     { 
      process.Kill(); 
      break; 
     } 
    } 

ou

foreach (var process in Process.GetProcesses()) 
    { 
     if (process.MainWindowTitle.Contains("test.dat")) 
     { 
      process.Kill(); 
      break; 
     } 
    }