Page 1 sur 1
stat sous windows?
Publié : mar. 29/déc./2015 14:26
par poshu
A peine je part que déjà je reviens (monde de merde!), on m'a demandé d'updater un TRES VIEUX code en PB.
Il servait à surveiller le déroulement d'un programme en observant son fichier log. Le programme ouvrait, écrivait, et fermait son fichier log; mais dans une nouvelle version, ce comportement a changé : il ne ferme son log que quand l'execution est finie.
Pour contourner le probleme, j'ai lu un peu de doc, et je suis tombé là dessus :
https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx Ca fait le job parfaitement, mais... Je n'ai aucune idée de comment l'utiliser avec PB. Ni les fonctions, ni les structures ne sont déclarées.
Comme j'ai pas vraiment envie de porter tout le programme en C++, je serais éternellement reconnaissant à celui ou celle qui pourrait m'expliquer...
Re: stat sous windows?
Publié : mar. 29/déc./2015 16:30
par Ar-S
Salut Poshu, Ne peux tu pas filer ce très vieux code ?
Re: stat sous windows?
Publié : mar. 29/déc./2015 17:05
par djes
Tu ne pourrais pas bidouiller avec FileSize() ? Si le log change, sa taille va forcément varier, non ?
Sinon, y'a peut-être moyen d'utiliser les fonctions plus simples GetFileAttributes() ou GetFileAttributesEx() ou GetFileTime()...
Re: stat sous windows?
Publié : mar. 29/déc./2015 18:55
par poshu
Le très vieux code, c'est le mien, il ne marche plus, puisque le programme que je surveille ne ferme plus son fichier log entre deux écritures.
Filesize, ça ne marche pas; par acquis de conscience, j'ai aussi essayé
GetFileSize et
GetFileSizeex à la main, mais ça ne marche pas non plus... Et toutes les autres fonctions citées souffrent du même problème : j'ai besoin de descendre plus bas, et ça, c'est via _stat().
_stat fonctionne très bien donc, la question étant : comment l'importer dans pure?
Re: stat sous windows?
Publié : mar. 29/déc./2015 20:03
par djes
J'ai crû comprendre que sous Windows, l'implémentation de stat() utilisait d'autres fonctions, donc que ce n'était pas si "bas niveau" que ça... Mais bon, apparemment, en regardant vite fait, y'a _stat là :
Code : Tout sélectionner
OpenLibrary(0, "msvcrt.dll")
_stat = GetFunction(0, "_stat")
CloseLibrary(0)
Re: stat sous windows?
Publié : mar. 29/déc./2015 20:26
par djes
J'ai essayé avec un bout de code pris sur le forum anglais (version MacOS), mais ça ne fonctionne que pour la date pour l'instant.
Code : Tout sélectionner
Structure timespec
tv_sec.i
tv_nsec.i
EndStructure
Structure stat64
st_dev.l; /* ID of device containing file */
st_mode.w; /* Mode of file */
st_nlink.w; /* Number of hard links */
st_ino.q; /* File serial number */
st_uid.l; /* User ID of the file */
st_gid.l; /* Group ID of the file */
st_rdev.i; /* Device ID */
st_atimespec.timespec; /* time of last access */
st_mtimespec.timespec; /* time of last data modification */
st_ctimespec.timespec; /* time of last status change */
st_birthtimespec.timespec; /* time of file creation(birth) */
st_size.q; /* file size, in bytes */
st_blocks.q; /* blocks allocated for file */
st_blksize.l; /* optimal blocksize for I/O */
st_flags.l; /* user defined flags for file */
st_gen.l; /* file generation number */
st_lspare.l; /* RESERVED: DO NOT USE! */
st_qspare.q[2]; /* RESERVED: DO NOT USE! */
EndStructure
ImportC "msvcrt.lib"
_stat64(path.p-ascii, *buf)
EndImport
_stat64(OpenFileRequester("Choisissez un fichier à charger", "", "", 0), @stats.stat64)
Debug "File size : " + stats\st_size
Debug "Last access : " + FormatDate("%yyyy/%mm/%dd", stats\st_atimespec\tv_sec)
CallDebugger
Re: stat sous windows?
Publié : mar. 29/déc./2015 20:29
par djes
En cherchant j'ai trouvé ce code pour Linux, y'a sûrement des trucs à utiliser :
http://forums.purebasic.com/german/view ... 21&t=28816
Re: stat sous windows?
Publié : mar. 29/déc./2015 21:03
par poshu
Okay, on peut importer des fonctions de l'api aussi facilement que ça? (c'est la seule fois où j'en ai eu besoin, d'habitude, c'est dispo de base, ahah)
Merci beaucoup! (je posterai mes résultats une fois que j'aurai fait un peu mumuse avec, si ça peut servir après)
Question qui tue : comment t'as trouvé que c'était dans msvcrt.lib? J'en vois pas de trace sur la msdn, et je vais avoir besoin d'autres fonctions...
Re: stat sous windows?
Publié : mar. 29/déc./2015 22:25
par djes
Oui, c'est assez simple, il y a plusieurs trucs, soit les callfunction(), soit les prototypes, soit les import. Voici la structure correcte je pense (pas sûr à 100%), tirée du SDK de Windows.
Code : Tout sélectionner
Structure stat
st_dev.l; /* ID of device containing file */
st_ino.l; /* File serial number */
st_mode.w; /* Mode of file */
st_nlink.w; /* Number of hard links */
st_uid.w; /* User ID of the file */
st_gid.w; /* Group ID of the file */
st_rdev.l; /* Device ID */
st_size.l; /* file size, in bytes */
st_atimespec.i; /* time of last access */
st_mtimespec.i; /* time of last data modification */
st_ctimespec.i; /* time of last status change */
EndStructure
ImportC "msvcrt.lib"
_stat(path.p-ascii, *buf)
EndImport
Name.s = OpenFileRequester("Choisissez un fichier à charger", "", "", 0)
_stat(Name, @stats.stat)
Debug FileSize(Name)
Debug "File size : " + stats\st_size
Debug "Last access : " + FormatDate("%yyyy/%mm/%dd", stats\st_atimespec)
CallDebugger
Re: stat sous windows?
Publié : mar. 29/déc./2015 22:35
par poshu
Windows me gave, mais d'une force... On est tellement mieux dans un environnement unix =_=;
Bon, en tous cas, ça marche (woohooh!) merci beaucoup pour l'aide ^^;
Re: stat sous windows?
Publié : mar. 29/déc./2015 22:40
par djes
De rien
