stat sous windows?

Sujets variés concernant le développement en PureBasic
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

stat sous windows?

Message 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...
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: stat sous windows?

Message par Ar-S »

Salut Poshu, Ne peux tu pas filer ce très vieux code ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: stat sous windows?

Message 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()...
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: stat sous windows?

Message 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?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: stat sous windows?

Message 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)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: stat sous windows?

Message 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
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: stat sous windows?

Message 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
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: stat sous windows?

Message 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...
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: stat sous windows?

Message 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
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: stat sous windows?

Message 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 ^^;
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: stat sous windows?

Message par djes »

De rien :)
Répondre