| | Fichiers INI non limités au program_directory | |
| | Auteur | Message |
---|
Morwenn Très bonne participation
Messages : 151 Projet Actuel : Icare
| Sujet: Fichiers INI non limités au program_directory Mar 5 Avr 2011 - 21:40 | |
| Comme vous le savez probablement, la lecture/écriture des fichiers INI est limitée au program_directory sous Game Maker. Ça peut paraître anodin, mais c'est déjà plus agaçant quand on sait que des fonctions comme get_open_filename() changent temporairement la place du program_directory. Ou bien simplement quand on a des fichiers INI dans des sous-dossiers bien précis... Enfin bref, il y a plein de cas tous plus improbables les uns que les autres dans lesquels on aimerait pouvoir modifier ses fichiers INI, peu importe où ils sont placés. J'en ai moi-même eu besoin, donc pour éviter d'être limité, j'ai reprogrammé certaines des fonctions permettant de gérer ces fichiers INI, afin qu'elles ne se limitent plus à un répertoire, mais qu'on puisse modifier des fichiers INI n'importe où. Leur utilisation est exactement la même à la différence près qu'il n'y a pas de ini_open() ni de ini_close(), il faut repasser le chemin du fichier à chaque fonction NOUVEAU : Les scripts ci-dessous sont plutôt basiques et désormais obsolètes. Je les ai depuis refait en C, et créé l'extension GM Power INI. Les fonctions y sont plus polyvalentes et plus sécurisées - Code:
-
// file_ini_section_exists(fname, section)
fname = argument0 section = argument1
if !file_exists(fname) { return 0 } file = file_text_open_read(fname)
nb_line = 1 while !file_text_eof(file) { str = file_text_read_string(file) if str = '[' + section + ']' { file_text_close(file) return nb_line } file_text_readln(file) nb_line += 1 } file_text_close(file) return 0 - Code:
-
// file_ini_key_exists(fname, section, key)
fname = argument0 section = argument1 key = argument2
if !file_exists(fname) { return 0 } file = file_text_open_read(fname)
nb_line = 1 requested_section = false while !file_text_eof(file) { str = file_text_read_string(file) if requested_section = true { char = string_char_at(str, 1) if char = '[' { file_text_close(file) return 0 } else if char != '' { i = 1 while string_char_at(str, i) != '=' { i += 1 } key_name = string_copy(str, 1, i-1) if key_name = key { file_text_close(file) return nb_line } } } if str = '[' + section + ']' { requested_section = true } file_text_readln(file) nb_line += 1 } file_text_close(file) return 0 - Code:
-
// file_ini_read_string(fname, section, key, default_value)
fname = argument0 section = argument1 key = argument2 default_value = argument3
if !file_exists(fname) { return default_value } file = file_text_open_read(fname)
requested_section = false while !file_text_eof(file) { str = file_text_read_string(file) if requested_section = true { char = string_char_at(str, 1) if char = '[' { file_text_close(file) return default_value } else if char != '' { i = 1 while string_char_at(str, i) != '=' { i += 1 } key_name = string_copy(str, 1, i-1) if key_name = key { file_text_close(file) return string_copy(str, i+1, string_length(str)-i) } } } if str = '[' + section + ']' { requested_section = true } file_text_readln(file) } file_text_close(file) return default_value - Code:
-
// file_ini_section_delete(fname, section)
fname = argument0 section = argument1
if !file_exists(fname) or !file_ini_section_exists(fname, section) { return true } file = file_text_open_read(fname) file_temp = file_text_open_write(temp_directory + '\temp_delete.ini')
requested_section = false while !file_text_eof(file) { str = file_text_read_string(file) if requested_section = true { if string_char_at(str, 1) = '[' { requested_section = false } } if str = '[' + section + ']' { requested_section = true } if requested_section = false { file_text_write_string(file_temp, str) file_text_writeln(file_temp) } file_text_readln(file) }
file_text_close(file) file_text_close(file_temp) file_copy(temp_directory + '\temp_delete.ini', fname)
return false - Code:
-
// file_ini_key_delete(fname, section, key)
fname = argument0 section = argument1 key = argument2
line = file_ini_key_exists(fname, section, key) if !file_exists(fname) or !line { return true }
file = file_text_open_read(fname) file_temp = file_text_open_write(temp_directory + '\temp_delete.ini')
nb_line = 1 while !file_text_eof(file) { str = file_text_read_string(file) if line != nb_line { file_text_write_string(file_temp, str) file_text_writeln(file_temp) } file_text_readln(file) nb_line += 1 }
file_text_close(file) file_text_close(file_temp) file_copy(temp_directory + '\temp_delete.ini', fname)
return false - Code:
-
// file_ini_write_string(fname, section, key, value)
fname = argument0 section = argument1 key = argument2 value = argument3
instruction = key + '=' + value
if file_exists(fname) and file_ini_section_exists(fname, section) { line = file_ini_key_exists(fname, section, key) file = file_text_open_read(fname) file_temp = file_text_open_write(temp_directory + '\temp_delete.ini') if line // Replace the current line by a new one { nb_line = 1 while !file_text_eof(file) { str = file_text_read_string(file) if nb_line = line { file_text_write_string(file_temp, instruction) } else { file_text_write_string(file_temp, str) } file_text_writeln(file_temp) file_text_readln(file) nb_line += 1 } } else // Add a new line at the end of the section { requested_section = false while !file_text_eof(file) { str = file_text_read_string(file) if requested_section = true { char = string_char_at(str, 1) if char = '' { file_text_write_string(file_temp, instruction) file_text_writeln(file_temp) } }
if str = '[' + section + ']' { requested_section = true } file_text_write_string(file_temp, str) file_text_writeln(file_temp) file_text_readln(file) } } file_text_close(file_temp) file_text_close(file) file_copy(temp_directory + '\temp_delete.ini', fname) } else { file = file_text_open_append(fname) file_text_write_string(file, '[' + section + ']') file_text_writeln(file) file_text_write_string(file, instruction) file_text_writeln(file) file_text_close(file) } Voilà. Je n'ai pas mis toutes les fonctions (il est très facile de refaire file_ini_read_real() quand on a file_ini_read_string()), mais l'essentiel est là, et normalement, tout marche correctement. Ce n'est peut-être pas optimisé non plus, mais je n'ai pas eu de problèmes de vitesse d'exécution, donc je pense que ça devrait aller chez tout le monde. J'éditerai si jamais j'optimise vraiment les fonctions, mais je doute que j'aille jusque-là =p Enfin bon, si jamais ça peut vous être utile, tant mieux
Dernière édition par Morwenn le Mar 26 Juil 2011 - 11:53, édité 6 fois |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Fichiers INI non limités au program_directory Mar 5 Avr 2011 - 22:03 | |
| Oh mais lawl t'as carrément recodé le systeme ini la x)
T'aurais pu juste copier le fichier ini dans le working_directory, après t'aurais pu utiliser les fonctions pour les ini.
Mais bon c'est très bien quand même, bien que tu te soit carrément pris la tête pour un truc qui aurais pu être fait beaucoup plus facilement :p |
| | | Morwenn Très bonne participation
Messages : 151 Projet Actuel : Icare
| Sujet: Re: Fichiers INI non limités au program_directory Mar 5 Avr 2011 - 22:10 | |
| En fait, faut le dire, j'avais envie de les refaire complètement. Et encore, ça va, les fichiers INI ont une structure assez simple (pour ne pas dire simpliste) =p Et puis comme ça, on peut traiter n'importe quel nombre de fichiers INI en parallèle, ce qui était plus compliqué avec les ini_open() et ini_close(). Et puis j'ai rajouté des valeurs de retour pour les read, afin de savoir si le fichier/section/clef demandé existe ou non. Et puis ça sert à rien que je me cherche des excuses, maintenant que c'est fait Ah oui, je rajoute quand même file_ini_write_string(fname, section, key, value) que j'avais oublié tout à l'heure. Et puis je viens de corriger un bug qui faisait une boucle infini dans le file_ini_key_delete() |
| | | SPLN Utilisateur confirmé: Rang ***
Messages : 588 Localisation : Sur son ordinateur *vous vois* arrêtez de me regarder comme ça Projet Actuel : En quête de projet(s)!
Mes projets:
SP Lecteur Multimedia (Stand by)
S-Portable Graphics (demo1.8 is out! demo2.0 is planned)
SSB RPG (Stand by)
| Sujet: Re: Fichiers INI non limités au program_directory Mer 6 Avr 2011 - 11:12 | |
| Je sens que ces scripts vont m'être utile ^^. |
| | | Morwenn Très bonne participation
Messages : 151 Projet Actuel : Icare
| Sujet: Re: Fichiers INI non limités au program_directory Mer 6 Avr 2011 - 16:20 | |
| Comme il fallait s'y attendre, je remet déjà des nouvelles versions de ces scripts^^"
Modifications effectuées : - file_ini_key_exists() et file_ini_section_exists() renvoient le numéro de la ligne où la clef/section a été trouvée, ou 0 si elle n'a pas été trouvée. Comme ça, on peut continuer à les utiliser de la même manière, tout en ayant une info supplémentaire. - file_ini_write_string() : jusque-là, que si la clef demandée existait, on la supprimait avant de la rajouter à la fin de la section. Maintenant, elle garde sa place (mais du coup, le script est plus long). - Quelques petites optimisations, notamment pour file_ini_read_string(). En effet, une fois qu'on a le numéro de ligne de la clef à lire, le traitement est plus simple =p
Enfin voilà. Je doute cependant que ça aille plus vite que les fonctions déjà présentes dans GM. |
| | | DeinDall Utilisateur confirmé: Rang ****
Messages : 858 Localisation : Quimper
| Sujet: Re: Fichiers INI non limités au program_directory Mer 6 Avr 2011 - 16:33 | |
| - Morwenn a écrit:
- Enfin voilà. Je doute cependant que ça aille plus vite que les fonctions déjà présentes dans GM.
--> DLL |
| | | Termite Utilisateur confirmé: Rang ****
Messages : 1005 Localisation : Dans ta charpente ! Projet Actuel : RayEngine 5.0
| Sujet: Re: Fichiers INI non limités au program_directory Dim 17 Avr 2011 - 16:31 | |
| - DeinDall a écrit:
- Morwenn a écrit:
- Enfin voilà. Je doute cependant que ça aille plus vite que les fonctions déjà présentes dans GM.
--> DLL La DLL que j'utilise pour les fichiers INI est plus lente que les fonctions INI de game maker (j'me souviens pas de son nom, mais les fonctions sont genre ini_read_stringx, ini_write_stringx, etc) |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Fichiers INI non limités au program_directory Dim 17 Avr 2011 - 16:39 | |
| Bah le gars qui a codé cette dll l'a fait avec les pieds lol |
| | | SPLN Utilisateur confirmé: Rang ***
Messages : 588 Localisation : Sur son ordinateur *vous vois* arrêtez de me regarder comme ça Projet Actuel : En quête de projet(s)!
Mes projets:
SP Lecteur Multimedia (Stand by)
S-Portable Graphics (demo1.8 is out! demo2.0 is planned)
SSB RPG (Stand by)
| Sujet: Re: Fichiers INI non limités au program_directory Dim 17 Avr 2011 - 18:13 | |
| Peut-être, ou pas. Ça dépends comment il s'y est pris. Je donne un exemple qui est celui de Saudio Plus. J'ai ajouté des fonctions mais j'ai créer une autre extensions substituant les scripts de la DLL/GEX Saudio du nom de SPLM Audio par mes scripts GML via MCI_command(). ( voir forum de SP Lecteur Multimedia ) Permettant de supprimer ce que j'ai appelé l'ERREUR 001 ou le non-chargement de la DLL/GEX où toutes les fonctions retournent 0. J'ai utilisé une méthode de BOURRIN pour substituer le chargement d'un média donc c'est plus lent, c'est sur. Et j'ai constaté que la fonction seek était plus rapide via mon extension que la sienne et corrigeais des bugs de latences qui permettait à ma barre "seek/chargement" de seek"er" en temps quasi réel si on déplaçais le bouton seek. ( c'était un plus grâce à un moins, tampis ... ) Donc voici ma conclusion: - SPLM Forumactif a écrit:
- En gros:
SPLM Audio est: - Plus lent au chargement - Plus rapide ailleurs car GML => MCI => SPLM* ; Sinon: GML => DLL => MCI => DLL (pas tous le temps le cas) => SPLM* ;
*: l'abréviation de SP Lecteur Multimedia. Donc on peut conclure que la DLL peut être plus lente que GM dans le cas où GM par un moyen ou par un autre peu passer par ce procédé sans avoir recourt à la DLL. Dans le cas de Termite ça pourrait s'expliquer par: GML => Modification Fichier => Projet; GML => DLL => Modification Fichier => DLL (pas tous le temps le cas) => Projet; De plus, si la "limite absolue" fais planter certaines DLLs pour rien autant utiliser le GML. Par contre c'est pas toujours le cas, heureusement car sinon les DLLs serait pas toujours pratique ce qui est loin d'être le cas! |
| | | onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Fichiers INI non limités au program_directory Dim 17 Avr 2011 - 19:35 | |
| Justement, pour ce qui est du calcul et de la gestion des fichiers utiliser un langage compilé est plus rapide. |
| | | Morwenn Très bonne participation
Messages : 151 Projet Actuel : Icare
| Sujet: Re: Fichiers INI non limités au program_directory Jeu 21 Juil 2011 - 12:54 | |
| Bon, j'avais un petit peu de temps libre ces derniers jours. Du coup, j'en ai profité pour reprendre un peu ces vieux bouts de scripts et pour recoder le tout en C, et faire un extension Game Maker. La lecture des fichiers a au passage été améliorée ainsi que quelques trucs. Voici le lien de téléchargement : GM Power INI. Avec un nom bien kitch, s'il-vous-plaît =p Il y a un fichier d'aide inclus qui explique brièvement les différences avec les fonctions déjà présentes dans Game Maker |
| | | Contenu sponsorisé
| Sujet: Re: Fichiers INI non limités au program_directory | |
| |
| | | | Fichiers INI non limités au program_directory | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |