AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 Fichiers INI non limités au program_directory

Aller en bas 
AuteurMessage
Morwenn
Très bonne participation
avatar

Messages : 151
Projet Actuel : Icare

MessageSujet: Fichiers INI non limités au program_directory   Mar 5 Avr 2011 - 19: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 Smile


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 happy1


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 Wink


Dernière édition par Morwenn le Mar 26 Juil 2011 - 9:53, édité 6 fois
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8962
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Fichiers INI non limités au program_directory   Mar 5 Avr 2011 - 20: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

_________________
                 
Revenir en haut Aller en bas
Morwenn
Très bonne participation
avatar

Messages : 151
Projet Actuel : Icare

MessageSujet: Re: Fichiers INI non limités au program_directory   Mar 5 Avr 2011 - 20: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 Smile

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() Wink
Revenir en haut Aller en bas
SPLN
Utilisateur confirmé: Rang ***
avatar

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)

MessageSujet: Re: Fichiers INI non limités au program_directory   Mer 6 Avr 2011 - 9:12

Je sens que ces scripts vont m'être utile ^^.

_________________
SP Lecteur Multimedia
I am an in the GM Quiz!
Revenir en haut Aller en bas
http://sp-lecteur-multimedia.skyrock.com/
Morwenn
Très bonne participation
avatar

Messages : 151
Projet Actuel : Icare

MessageSujet: Re: Fichiers INI non limités au program_directory   Mer 6 Avr 2011 - 14: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.
Revenir en haut Aller en bas
DeinDall
Utilisateur confirmé: Rang ****
avatar

Messages : 858
Localisation : ~Quimper
Projet Actuel : Un jeu où tu joues.

MessageSujet: Re: Fichiers INI non limités au program_directory   Mer 6 Avr 2011 - 14:33

Morwenn a écrit:
Enfin voilà. Je doute cependant que ça aille plus vite que les fonctions déjà présentes dans GM.
--> DLL

_________________
.
Revenir en haut Aller en bas
Termite
Utilisateur confirmé: Rang ****
avatar

Messages : 1005
Localisation : Dans ta charpente !
Projet Actuel : RayEngine 5.0

MessageSujet: Re: Fichiers INI non limités au program_directory   Dim 17 Avr 2011 - 14: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)

_________________
Because these are not the words of God, the same God that burnt the knowing.
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8962
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Fichiers INI non limités au program_directory   Dim 17 Avr 2011 - 14:39

Bah le gars qui a codé cette dll l'a fait avec les pieds lol

_________________
                 
Revenir en haut Aller en bas
SPLN
Utilisateur confirmé: Rang ***
avatar

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)

MessageSujet: Re: Fichiers INI non limités au program_directory   Dim 17 Avr 2011 - 16: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!

_________________
SP Lecteur Multimedia
I am an in the GM Quiz!
Revenir en haut Aller en bas
http://sp-lecteur-multimedia.skyrock.com/
onilink_
Modérateur
avatar

Messages : 8962
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: Fichiers INI non limités au program_directory   Dim 17 Avr 2011 - 17:35

Justement, pour ce qui est du calcul et de la gestion des fichiers utiliser un langage compilé est plus rapide.

_________________
                 
Revenir en haut Aller en bas
Morwenn
Très bonne participation
avatar

Messages : 151
Projet Actuel : Icare

MessageSujet: Re: Fichiers INI non limités au program_directory   Jeu 21 Juil 2011 - 10: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 happy1

_________________

Dur Dabla, pour qui voudrait écouter un brin de metal celtique.
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: Fichiers INI non limités au program_directory   

Revenir en haut Aller en bas
 
Fichiers INI non limités au program_directory
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Fichiers vidéo limités à 4go en reflex !! Vous aussi ?
» fusionner 2 fichiers heredis
» Les éditions limitées
» Les fichiers et leurs extensions
» [résolu] Icones fichiers tristounets !

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Scripts GML-
Sauter vers: