Problème de modif d'attributs sur répertoires :

Sujets variés concernant le développement en PureBasic
DominiqueB
Messages : 47
Inscription : sam. 01/mai/2004 14:41

Problème de modif d'attributs sur répertoires :

Message par DominiqueB »

Hello,
j'ai un petit soucis:
j'ai un programme qui copie des fichiers et des répertoires depuis un CDROM vers mon disque dur.
Comme de bien entendu, après copie tous les répertoires et les fichiers sont en lecture seule, normal.

Après recopie sur mon disque dur, le programme doit modifier tous les attributs (des fichiers et des répertoires) de lecture seule vers normal.
Le code fonctionne parfaitement sur w98se, mais les répertoires refusent de passer en attribut normal sous xp.
Pour info, je suis bien en mode administrateur, donc j'ai les droits de faire cette manipulation, et le problème se pose aussi bien pour xp sp1 que sp2.
Voici le code que j'utilise: (récupéré sur le forum)

Code : Tout sélectionner

; 07/12/2004: mise au point de la procédure de modification d'attributs (répertoires et fichiers).
;   Les fonctions de Windev échouent: si le rep ne contient aucun fichier, il n'est pas parcouru
;   et son attribut ne peut être changé !
;   Reste à trouver pourquoi cela ne fonctionne pas sous XP, pour les rep ! (l'attribut reste inchangé)
Procedure GetList(SourceDirectory$, Start)

  If ExamineDirectory(Start, SourceDirectory$, "*.*")
    SetFileAttributes_(SourceDirectory$, #FILE_ATTRIBUTE_NORMAL)      ; Threaded search start
    Repeat                                                           ; Repeat all the following
      Type = NextDirectoryEntry()                                    ; Set file or directory to start
      If Type = 2                                                                    
        If DirectoryEntryName() <> "." And DirectoryEntryName() <> ".."
          a$ = SourceDirectory$ + DirectoryEntryName()
          Debug "Dir avant: " + a$
          trer = SetFileAttributes_(a$, #FILE_ATTRIBUTE_NORMAL)
          a$ + "\"
          Debug "Dir après: " + a$ + " Résultat: " + Str(trer)
          GetList(a$, Start + 1)
          UseDirectory(Start)
        EndIf
      Else
        If Type = 1
          Place$ = SourceDirectory$ + DirectoryEntryName()
                                 ; Add the filename and directory
          rest = SetFileAttributes_(Place$, #FILE_ATTRIBUTE_NORMAL)
          Debug "File: " + Place$ + " Résultat: " + Str(rest)
        EndIf
      EndIf
    Until Type = 0
  EndIf
  
EndProcedure


b.s = PathRequester("Choisissez un répertoire et appuyez sur entrée", "") 

If b <> ""
  GetList(b, 0)
  MessageRequester("Info", "")
EndIf

Quelqu'un avec xp pourais-t-il m'aider ?
merci

Dominique
Dominique
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

chez moi idem sur xp sp2.
j'ai beau remanier le code. rien à faire.
mais de toutes facons l'explorateur windows réagit pareil.

si tu as une clef USB ou autre, essaye ton prog sur un disque en FAT,
puis en FAT32, puis en NTFS... juste pour voir :roll:
Image
DominiqueB
Messages : 47
Inscription : sam. 01/mai/2004 14:41

comment ?

Message par DominiqueB »

merci d'avoir essayé,
qu'est-ce que tu veux dire par: "l'explorateur windows réagit pareil" ?

Si je clique droit sur un répertoire, et que je met son attribut en "lecture seulement", ca passe.
Donc je ne vois pas ce que tu veux dire ?

merci

Dominique
Dominique
DominiqueB
Messages : 47
Inscription : sam. 01/mai/2004 14:41

mince, mazette ! ! !

Message par DominiqueB »

t'as raison, je viens d'essayer et l'attribut revient en "lecture seulement" !

C'est quoi ce bins ? ? ?

Quelqu'un à une idée sur cette bizarrerie ?

Dominique
Dominique
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

t'a essaye en passant
par la console DOS avec la fonction attrib
pour voir si ça marche ?
ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [[lect:] [chemin] fichier]
[/S [/D]]

+ Définit un attribut.
- Efface un attribut.
R Attribut de fichier en lecture seule.
A Attribut de fichier archive.
S Attribut de fichier système.
H Attribut de fichier caché.
[Lecteur:][Chemin][NomFichier]
Spécifie le ou les fichiers que ATTRIB doit traiter.
/S Traite les fichiers dans le dossier courant
et dans tous les sous-dossiers.
/D Traite aussi les dossiers.
[/code]
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

"Lecture seule" revient mais en grisé...
c'est l'explorateur qui est bizarre, pas l'API

en fait tout semble etre ok.
regarde avec mon code test et fait joujou avec.
tout est se comporte normalement en fait...

Code : Tout sélectionner

Procedure GetAttr(FileName$)
  
  Result.s = ""
  Attr.l   = GetFileAttributes_(FileName$)
  
  If Attr & #FILE_ATTRIBUTE_READONLY   : Result+"R" : EndIf
  If Attr & #FILE_ATTRIBUTE_HIDDEN     : Result+"H" : EndIf
  If Attr & #FILE_ATTRIBUTE_SYSTEM     : Result+"S" : EndIf
  If Attr & #FILE_ATTRIBUTE_DIRECTORY  : Result+"D" : EndIf
  If Attr & #FILE_ATTRIBUTE_ARCHIVE    : Result+"A" : EndIf
  If Attr & #FILE_ATTRIBUTE_NORMAL     : Result+"N" : EndIf
  If Attr & #FILE_ATTRIBUTE_TEMPORARY  : Result+"T" : EndIf
  If Attr & #FILE_ATTRIBUTE_COMPRESSED : Result+"C" : EndIf
  If Attr & #FILE_ATTRIBUTE_OFFLINE    : Result+"O" : EndIf
  
  Debug LSet(Result,8,"_") + " " + FileName$
  SetFileAttributes_(FileName$,#FILE_ATTRIBUTE_NORMAL)
  SetFileAttributes_(FileName$,#FILE_ATTRIBUTE_READONLY)
  
EndProcedure

Procedure GetList(dirID.l,DirectoryName$) 
  If ExamineDirectory(dirID,DirectoryName$,"")
    GetAttr(DirectoryName$)
    Repeat
      Select NextDirectoryEntry()
        Case 0
          Break
        Case 1
          GetAttr(DirectoryName$+DirectoryEntryName())
        Case 2
          If DirectoryEntryName()<>"." And DirectoryEntryName()<>".." 
            GetList(dirID+1,DirectoryName$+DirectoryEntryName()+"\") 
            UseDirectory(dirID)
          EndIf
      EndSelect
    ForEver
  EndIf
EndProcedure

GetList(0,"F:\PureVisionXP\")
MessageRequester("Debug","FIN")
Image
Répondre