Comment puis-je comparer les deux fichiers dans golang?
Avec Python, je peux faire le suivant:
equals = filecmp.cmp(file_old, file_new)
Est-il intégré la fonction pour le faire dans le langage go? J'ai cherché sur google mais sans succès.
Je pourrait utiliser une fonction de hachage dans hash/crc32
paquet, mais c'est plus de travail que le code Python.
Pouvez-vous préciser la question? Il est demandé pour deux choses différentes (un remplaçant pour
Bien sûr, j'écris un outil de comparaison en Python (pour l'auto-apprentissage de Python) qui font que les patchs de la comparaison des fichiers et l'utilisation de la filecmp.cmp fonction de comparaison de l'ancien et le nouveau fichier. Droit maintenant, je suis en train d'écrire le même outil en utilisant Aller Lang et je ne trouve pas une fonction comme ci-dessus, donc mes questions, si pour trouver un builtin fonction de comparaison de fichiers, mais, si elle n'existe pas, j'avais suggéré d'utiliser certains de fonction de hachage ou d'écrire un octet par octet fonction de comparaison. Désolé mon anglais
filecmp.cmp
et un moyen de voir si les deux fichiers contiennent les mêmes octets).Bien sûr, j'écris un outil de comparaison en Python (pour l'auto-apprentissage de Python) qui font que les patchs de la comparaison des fichiers et l'utilisation de la filecmp.cmp fonction de comparaison de l'ancien et le nouveau fichier. Droit maintenant, je suis en train d'écrire le même outil en utilisant Aller Lang et je ne trouve pas une fonction comme ci-dessus, donc mes questions, si pour trouver un builtin fonction de comparaison de fichiers, mais, si elle n'existe pas, j'avais suggéré d'utiliser certains de fonction de hachage ou d'écrire un octet par octet fonction de comparaison. Désolé mon anglais
OriginalL'auteur rvillablanca | 2015-04-08
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr que la fonction ne ce que vous pensez que cela fonctionne. À partir de la docs,
Votre appel est en ne comparant que les signature de
os.stat
, qui ne comprend que:Vous pouvez apprendre tous les trois de ces choses à Aller de l'
os.Stat
fonction. Ce serait vraiment seulement indiquer qu'ils sont littéralement le même fichier, ou des liens symboliques vers le même fichier, ou une copie de ce fichier.Si vous voulez aller plus loin, vous pouvez ouvrir les deux fichiers et de les comparer (version de python lit 8k à un moment).
Vous pouvez utiliser un crc ou un hachage md5 pour les deux fichiers, mais si il y a des différences au début d'un long fichier, vous voulez arrêter tôt. Je recommande la lecture d'un certain nombre d'octets de chaque lecteur et en le comparant avec
octets.Comparez
.OriginalL'auteur captncraig
Pour compléter le @captncraig réponse, si vous voulez savoir si les deux fichiers sont identiques, vous pouvez utiliser le SameFile(fi1, fi2 FileInfo) méthode dans le package du système d'exploitation.
Sinon, si vous voulez vérifier le contenu des fichiers, ici, c'est une solution qui vérifie les deux fichiers ligne par ligne, en évitant la charge de l'ensemble des fichiers dans la mémoire.
Premier essai: https://play.golang.org/p/NlQZRrW1dT
EDIT: Lire par octets morceaux et échouer rapidement si les fichiers n'ont pas la même taille. https://play.golang.org/p/YyYWuCRJXV
bytes.Equal
que vous allez (qui est ce que @captncraig l'indique).BTW, il ne fonctionnera certainement pas pour les fichiers binaires sans assez fréquentes 0x0A octets: "la Numérisation s'arrête unrecoverably à des expressions du FOLKLORE, la première erreur d'e/S, ou un jeton trop grand pour tenir dans la mémoire tampon." (À partir de bufio.Scanner).
Merci pour vos commentaires. J'ai édité ma réponse de suivre vos conseils. Avez-vous une idée d'une bonne taille de bloc par défaut ?
4k, 8k, 64 k, ou 128k sont susceptibles de choix pour les "vrais" lecture de code à partir de fichiers mais rien n'est beau comme un exemple. En général avec un
io.Reader
vous aimerais aussi avoir à gérer de courtes lectures (ou utilisezio.ReadFull
et de traiter avecio.ErrUnexpectedEOF
);os.File
ne semble pas garantir de ne pas donner une courte lecture. Tous les cas de coin commence à devenir agaçant :(. Probablement pas la peine de traiter avec une SORTE exemple, cependant.Package complet ici: github.com/udhos/equalfile
OriginalL'auteur Pith
Comment sur l'utilisation de
bytes.Equal
?3. ignorer les erreurs
Mise à jour par @StephenWeinberg, 1. bon point. 2. octets.L'égalité n'existe pas et que vous avez raison, c'est nettement plus rapide que la réflexion, de la mise à jour de l'extrait de code.
Mise à jour par @Dave C 3. J'ai été "paresseux" dans cet exemple (je n'ai pas un forfait déclaration ou d'une fonction principale, de sorte que ce code d'erreur si quelqu'un copie-collé), donc j'ai manipulé les erreurs et les mises à jour de n'importe quel code qui n'auraient pas compilé et exécuté. Espérons que satisfait de votre problème avec ma réponse.
Vous ne parvenez pas à résoudre le problème 1. Vous êtes toujours en train de charger les deux fichiers entièrement en mémoire. Vous n'avez résoudre les problèmes 2 et 3.
OriginalL'auteur chaseadamsio
Vous pouvez utiliser un programme comme equalfile
API principales:
Godoc: https://godoc.org/github.com/udhos/equalfile
Exemple:
const defaultMaxSize = 10000000000 // Only the first 10^10 bytes are compared.
ce que l'enferCe défaut de taille maxi est une protection contre une éventuelle illimité de flux qui serait la cause d'une interminable de comparaison. Vous pouvez le remplacer en utilisant l'option " Options.MaxSize'. Si vous avez une meilleure stratégie pour gérer les flux infinis, veuillez ouvrir une pull request.
OriginalL'auteur Everton