2009-08-14 6 views
2

Je dois ouvrir un fichier, désérialiser une liste d'objets, supprimer un des objets de la liste et re-sérialiser la liste <> de nouveau dans le fichier sans libérer un verrou sur le fichier .Filestream, verrouillage et serlialization

Désérialisation et suppression de l'objet de la liste <> ne pose aucun problème, le problème survient lorsque j'essaie de sérialiser la liste <> de nouveau au fichier car j'obtiens les restes des données précédentes ... n'importe qui une idée comment supprimer les anciennes données restantes à la fin du fichier?

Merci, Paul.

+0

On dirait que vous devriez utiliser une base de données. SQL Server Express 2008 est gratuit et prend en charge les colonnes XML. –

+0

Salut John. Si j'avais écrit la spécification alors c'est ce que j'aurais utilisé, malheureusement je ne l'ai pas fait donc je dois me débrouiller avec des fichiers. – paulio

Répondre

0

je reçois les restes des données précédentes

Je suppose que vous ouvrez le fichier avec un accès en lecture/écriture, et que vous le garder ouvert entre désérialisation et sérialisation? Vous devez:

  • Ouvrez le fichier en lecture seule, désérialiser vos données, et fermez le fichier
  • Ouvrez le fichier en écriture seule (sans ajouter à elle), sérialiser vos données, et fermez le fichier

MISE À JOUR:

Comment puis-je garder le fichier verrouillé entre ces deux opérations séparées?

Bon point ... dans ce cas, vous pouvez essayer de tronquer le courant alors qu'il est ouvert, en utilisant SetLength:

using(FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) 
{ 
    data = Deserialize(fs); 
    DoSomething(data); 

    // Truncate the file : 
    fs.SetLength(0) 
    fs.Position = 0; 

    Serialize(fs, data); 
} 

(non testé)

+0

Comment conserver le fichier verrouillé entre ces deux opérations distinctes? – paulio

+0

voir ma mise à jour –

+0

Merci Thomas, votre code fonctionne parfaitement comme vous l'avez écrit. C'est drôle comment parfois les réponses sont si simples que vous les manquez (dans ce cas la méthode SetLength()).Merci encore, Paul. – paulio

2

Ouvrez le fichier en tant que (FileMode.Truncate) lors de l'écriture de vos données sérialisées dans le fichier. Cela garantira que le fichier est complètement écrasé par vos nouvelles données et vous ne vous retrouverez pas avec les restes des données existantes.

Voir "FileMode.Truncate":
http://msdn.microsoft.com/en-us/library/system.io.filemode(VS.85).aspx

De plus, je vous recommande d'utiliser protobuf-net d'utiliser comme moteur de sérialisation. C'est un système de sérialisation plus rapide et (dans certains cas tel que l'obfuscation) plus fiable.

+0

Merci pour le commentaire mais comment puis-je garder le fichier verrouillé entre ces deux opérations distinctes? – paulio

+0

Avez-vous le contrôle de tous les processus d'écriture dans le fichier? Si oui, utilisez un mutex pour la synchronisation: http://www.albahari.com/threading/part2.aspx#_Mutex –

+0

Merci pour la réponse rapide. Malheureusement, je n'ai aucun contrôle sur le (s) processus d'écriture dans le fichier. – paulio

Questions connexes