2010-06-29 3 views
1

Je travaille sur une classe de gestionnaire de fichiers et je rencontre des problèmes avec les flux de fichiers. Fournir des fonctionnalités pour des opérations telles que l'ajout et l'écrasement est une simple question de changer le mode passé à fopen. Cependant, fournir un moyen facile d'insérer, de mettre à jour et de supprimer s'avère plus difficile. À peu près, tous les problèmes que j'ai est avec fwrite.PHP - Les lacunes de fwrite?

Insertion - Autant que je sache, il n'y a pas moyen d'insérer des caractères à un emplacement autre que la fin du fichier en utilisant fwrite. Les deux options que j'ai trouvées utilisent file_get_contents et utilisent fseek/fwrite pour étendre le fichier.

Supprimer - Malheureusement, essayer d'écrire NULL en utilisant fwrite n'est pas la même chose qu'une 'suppression' d'un caractère. Comme pour l'insertion de données, les options sont à nouveau file_get_contents et fseek/fwrite.

Mise à jour - La mise à jour des données dans un fichier est une combinaison des problèmes d'insertion/suppression. Si la nouvelle valeur est plus courte que l'ancienne valeur, je devrais supprimer les caractères supplémentaires. Si la nouvelle valeur est plus longue que l'ancienne valeur, je devrais insérer les caractères supplémentaires. Si elles ont la même longueur, il suffit d'utiliser fwrite.

Heureusement, il y a quelque chose que je ne connais pas qui peut résoudre ce problème proprement. Chacune des options trouvées utilise soit file_get_contents (ce qui ne m'intéresse pas car le fichier entier doit être lu en mémoire), soit utilise fseek/fwrite pour changer la longueur du fichier (ce qui me semble compliqué).

Est-ce que quelqu'un a une idée à laquelle je n'ai pas pensé?

Merci!

+0

Je suppose que l'utilisation d'une base de données n'est pas une option? –

+0

C'est exact. Malheureusement, je dois traiter des fichiers plats par opposition aux bases de données. Bien que j'espérais obtenir une interface suffisamment claire sur la classe, elle pourrait aussi être réutilisée comme gestionnaire de base de données. – Ogo

Répondre

1

Vous pouvez toujours utiliser fseek() et fwrite() pour mélanger le fichier en morceaux de taille fixe plutôt qu'en utilisant file_get_contents(). La logique est assez simple, mais je suppose que ce serait lourd et lent s'il est implémenté directement en PHP plutôt qu'en tant que bibliothèque C.

+0

Ouais, c'est l'option fseek/fwrite à laquelle je faisais allusion. Je ressens la même chose à ce sujet. – Ogo

1

C'est tout. Presque toutes les langues vont le faire de la même manière. La méthode recommandée consiste à utiliser un fichier temporaire et à transférer le fichier original pièce par pièce, puis à déplacer le fichier temporaire sur l'original. Cependant, il existe des programmes qui font de telles choses pour vous, et de manière beaucoup plus optimisée - principalement les moteurs de base de données.

Questions connexes