Question

Langue utilisée: C #

Théorie: Je veux créer un fichier avec le drapeau FileOptions.DeleteOnClose dans un dossier temporaire. Le fichier est créé avec succès et j'écrire Dato sur elle, l'étape suivante consiste à lancer l'application associée au fichier Process.Start(...) et permettre à l'utilisateur d'inspecter le document, enfin je ferme ma poignée et, dès que d'autres processus de fermeture de la poignée à la fichier temporaire, le fichier est supprimé par le système d'exploitation.

Mon problème est que d'autres processus ne peuvent pas ouvrir le fichier, même pour la lecture, en dépit si j'ajoute FileShare.ReadWrite | FileShare.Delete au mode de partage.

Toutes les suggestions?

Était-ce utile?

Autres conseils

Vérifiez ceci:

Vous devez vous assurer que tous processus ouvrent le fichier avec FileShare.ReadWrite et FileShare.Delete.

Même si le créateur ouvre avec des actions readwrite, si un deuxième programme tente d'ouvrir avec une part lire, le deuxième programme est essentiellement que personne ne peut écrire d'autre. Mais le premier programme a déjà le pouvoir de sorte que la seconde ouverture échoue.

Passez à Linux scnr

Ok, sérieusement maintenant: C'est une faille dans le système d'exploitation Windows qui ne peut pas vraiment être contournées. Chaque programme ouvrant le fichier doit se mettre d'accord sur d'autres programmes ayant le fichier ouvert dans le même temps. Ce fut un problème que je suis arrivé il y a plusieurs années quand je encore utilisé Windows ainsi. Il ne suffit pas d'ouvrir un fichier et dire: Que quelqu'un d'autre ouvrir aussi. Les autres doivent aussi dire ouvrir ce fichier, même si elle est déjà ouverte.

Sous Linux au contraire, le système d'exploitation ne permet pas de fichier de verrouillage de la façon dont Windows fait du tout. Ici, si un fichier est utilisé par plus d'un programme en même temps, les programmes lui-même doit se assurer que les accès concurrents se lock-out. De plus, sous Linux, nous pouvons simplement créer le fichier, assurez-vous que l'autre processus a été démarré et ouvert le fichier, puis supprimez simplement le fichier (alors qu'il est ouvert). Le nom de fichier est alors retiré du système de fichiers immediatelly, mais le fichier est toujours maintenu par le pilote du système de fichiers jusqu'à ce que le dernier lien (y compris les descripteurs de fichiers ouverts) se est retiré.

Retour à votre problème: Comme tout cela doe travail sous Windows, vous pouvez faire deux autres approches:

  1. Enregistrez le fichier à supprimer au prochain démarrage (dans les jours Win3x, il y avait une section dans le win.ini pour cela. Version plus récente de Windows soutiennent encore, je ne peux pas me rappeler plus longtemps, comment cela se fait maintenant ).
  2. Lancer l'autre processus, attendez pour ouvrir le fichier, fermez le fichier puis essayez chaque minute pour supprimer le fichier jusqu'à ce que la suppression réussit ...

Cordialement, Bodo

scroll top