Comment puis-je déterminer le nouveau séparateur de ligne utilisé par OS (LF, CR / LF ou autre), dans Ruby? P>
3 Réponses :
Je ne sais pas si une solution directe pour obtenir le type de nouvelle ligne basée sur le système d'exploitation, mais il existe la variable Vous pouvez détecter le système d'exploitation et puis définissez pour détecter le système d'exploitation: p> N'oubliez pas que lors de la lecture de fichiers Ils pourraient avoir un mélange de différents séparateurs de ligne - par exemple si un fichier texte a été modifié à la fois dans Windows et Linux. Ainsi, si vous traitez des fichiers, ne dépendez pas du «Sperateur de la ligne OS» exclusivement. P> p> $ / CODE> contient le "séparateur d'enregistrement d'entrée". Par défaut, cela sera "\ n". ( Documentation ici )
$ / code> à la valeur "correcte". p>
Ok, je pense qu'il n'y a pas de meilleure solution.
File.open("some_temporary_file", "w") { |file| file.puts } new_line_separator = File.open("some_temporary_file", "rb") { |file| file.read }
Vous ne devriez pas avoir besoin de. Dans votre cas, je pense que vous pouvez simplement utiliser FLITUTILS. P>
Je travaille avec un vieux matériel et un système d'exploitation qui ne fonctionne pas correctement avec FTP. J'ai besoin de déterminer le nouveau séparateur de ligne système afin que je puisse transférer les fichiers sur le FTP cassé.
Pouvez-vous expliquer un peu plus? En particulier, comment la mise en œuvre FTP est-elle cassée? Est-ce trop cassé pour net :: ftp?
Non, Net :: FTP fonctionne bien. C'est un IBM Mainframe, en mode texte, il gère les séparateurs de nouveaux lignes de système local en tant que séparateurs d'enregistrements. Et il n'est pas possible d'effectuer toutes les conversions nécessaires localement et de transférer le fichier en mode binaire car il n'ya aucun moyen de mettre un marqueur de séparateur d'enregistrement dans le fichier.
Alors, quel est le problème, alors?
Je veux me débarrasser du zoo de modes (texte, binaire, shminaire, etc.) et laisser le mode binaire uniquement. Et aussi, je veux toujours travailler avec le matériel hérité.
Comment proposez-vous d'écrire une chaîne à un fichier en mode binaire?
Comme si. La chaîne et la byearray dans Ruby sont les mêmes choses (au moins 1.8.7) afin qu'elles soient écrites, sans conversions magiques telles que la préparation de "\ r" à "\ n", codant dans un peu de codépage légèrement différent ou autre chose. Vous avez des octets - vous écrivez des octets.
Oh je vois. Tout cela ressemble à une mauvaise idée - vous devriez probablement travailler avec i> les outils de fichier de Ruby, si possible, ne les vaincez pas.
J'essaie simplement de les envelopper à quelque chose de plus pratique et que je me débarrasse simultanément des problèmes causés par le logiciel hérité (modes ouverts et autres) et matériel.
Pourquoi avez-vous besoin de ces informations? Quel est votre cas d'utilisation?
J'écris une sorte de cadre orienté objet pour travailler avec des fichiers et je souhaite vous débarrasser de tels problèmes hérités comme "Mode texte / binaire", "Conversion de charset lors de la FTP-ING", etc. J'ai décidé qu'il est préférable d'accomplir tout opérations en mode binaire et qui a provoqué un petit problème avec la méthode "myfile.UT". La fonction est destinée à écrire un nouveau séparateur de ligne à la fin de la ligne et le séparateur doit être le plus attendu par l'utilisateur du cadre.
Cela semble être très problématique. Mieux vaut ne pas réinventer la manipulation du fichier que la langue vous donne déjà. Ruby déjà a i> un cadre OO pour traiter avec des fichiers ...
Désolé, mais je ne l'ai pas trouvé ... J'ai besoin de quelque chose comme ceci:
file.new ("abc.txt", "un contenu"). Copy_to (répertoire ["C: \ TEMP ']). Copy_TO (RemoteDirect ORY [CIDÉTILISATIONS, '/']). RENAME ("DEF.TXT") CODE>. Ruby a-t-il quelque chose comme ça?
Pour autant que je sache, FileTiltils est juste une collection de routines qui obtiennent des noms de fichiers et effectuer des opérations. Ce n'est pas OO Cadre. Ce que j'attends, c'est une abstraction de fichier (que ce soit local, distant, astral ou tout autre) qui dispose de certaines opérations applicables telles que "Copier au répertoire", "Supprimer", "Ouvrir", etc.
FileTutils fait exactement ce que vous avez donné dans l'exemple ci-dessus. Si vous devez également travailler avec des fichiers distants, vous pouvez probablement l'envelopper avec Net :: FTP et Net :: http.
Voilà ce que je vais faire. Je reçois une instance du fichier (
f = localfile ['abc.txt'] code>) ou crée un nouveau fichier (
f = localfile.new ('def.txt', "Quelques contenus ') code>) puis le règne comme je veux:
f.copy_to (répertoire.temporary) .rewrite {| contenu | content.gsub ("ABC", "DEF")} .MOVE_TO (RemoteDirectory ['FTP: // localhost / ICI "]) Code> etc. avec fileUtils On dirait:
fichier.write (f = "abc.txt", "un peu de contenu"); cp (f, dir.tmpdir); Fichier.rewrite (f) {| contenu | ...}; MV (F, Quoi ???) Code>. Je veux travailler avec des fichiers comme des objets de programme complets, pas comme des chaînes.