File().rename() ne renomme pas

J’utilise File().rename() en rempalcement de MOVE DOCUMENT et ça ne fonctionne pas $filePathNew2_t:=File($filePathOld_t).rename($filePathNew_t)
au lieu de
MOVE DOCUMENT($filePathOld_t;$filePathNew_t)

filePathNew2_t me renvoie une valeur nulle.
Où est l’erreur ?

J’ai voulu remplacer MOVE :

  • pour être moderne !
  • parce que j’ai un problème de blocage du fichier non détecté par MOVE qui me crée le nouveau sans supprimer l’ancien.

Ça fonctionne partout ?
Je viens de passer en V18 R2 et j’ai toujours le problème.

la variable $filePathNew_t fait penser que c’est un chemin et pas un nom de fichier ?

Il y a la function file.moveTo ( destinationFoder {; newName} ) qui serait peut être plus la réponse à votre besoin.

filePathNew_t est le nom long du fichier avec le dossier.

Ça ne fonctionne pas non plus.
Je me suis aperçu que je n’avais pas converti en posix mais ça ne change rien…

Je pense que c’est là le problème, la fonction attend un nom de fichier et pas un chemin

Pouvez vous montrer votre code pour que puisse vous aider ?

Bernard,

To give you a pattern here is a line that is working:

 // 1) copy the doc to the sandbox
$wkbk_o:=File($dd_doc_o.d.fullPath;fk platform path).copyTo($sandbox_o;fk overwrite)

Note that $sandbox_o is a Folder object.
$dd_doc_o.d.fullPath could just as easily be a text variable, as I believe you are working with.

Je suis revenu à l’exemple de la doc en changeant juste le nom du fichier :

$toRename:=File("DS128:folder1:pict1.jpg";fk platform path)
$newName:=$toRename.rename($toRename.name+"_new"+$toRename.extension)

Ça ne fonctionne toujours pas ; évidement j’ai vérifié que toRename est correct.

J’ai mis l’exemple de la doc dans une base neuve ; ça ne fonctionne pas non plus.
Les erreurs
image
L’erreur 601 n’est pas dans la doc.

Tu t’en fiches, c’est toujours l’erreur d’origine, celle du bas, qui compte ; ici 2. Celles au-dessus ne sont que ses conséquences.

T’as essayé de mettre des assert ? Genre :

assert(test path name($toRename)=is document)  
//vazy, fait moi mal, j'adore les assert

Perso, j’en utilise beaucoup dès qu’il s’agit de chemins. Je trouve plus simple de me prendre une erreur que me démolir le moral avec des chemins que ni mes yeux ni mon cerveau ne captent jamais.

Pas besoin, tu mets un point d’arrêt après la première ligne et tu vois si 4D produit un objet File, ce qui est le cas.
Peux-tu tester ces deux lignes avec une de tes images STP ?
J’ai tenté la conversion en mode projet, ce qui ne résoud pas le problème.

En résumé, j’ai des anomalies propres à ma base (commentaires multilignes) et générales en V18 R1 et R2 : les fonctions rename(), moveTo() ne fonctionnent ni en mode binaire, ni en mode projet, ni dans ma base, ni dans une fraîchement créée.

Bernard,
j’ai testé l’exemple de la doc et ça marche.
Cela dit, 2 choses :
1/
comme évoqué à l’apéro :smile:, je me suis beaucoup servi de ASSERT pour vérifier point par point et comprendre nombre de choses qui m’avaient échappées sur ces histoires de fichiers et dossiers. Par exemple, avant même ta première ligne de code, je ferais un ASSERT(test path name(leCheminSurNAS)) histoire de ne pas perdre de temps ensuite.
2/
je n’avais pas tilté hier sur le fait que tu testes sur ton synology… Voir le code joint, le “si faux” au début, et la copie écran d’erreur si j’utilise ce volume : en testant avec le fichier sur mon disque ça marche, mais pas sur NAS. Il semble donc qu’on ne puisse pas renommer avec cet appareil. Comme avec le Finder je peux renommer mes fichiers sur NAS, je ne pige pas pourquoi, peut être qu’un “sachant” pourra nous le dire.

  //création d'un document de test
$folder_t:=System folder(Desktop)  //test fichier sur disque système
If (False)
	$folder_t:=Convert path POSIX to system("/Volumes/divers/")  //test fichier sur NAS
End if 
$ext_t:=".txt"
$doc_t:="___"+Generate UUID+$ext_t
$doc_t:=$folder_t+$doc_t
$ref_h:=Create document($doc_t)
CLOSE DOCUMENT($ref_h)
  //un peu de parano
ASSERT(Test path name($doc_t)=Is a document;"document inexistant")
  //création objet File
C_OBJECT($fichier1_o;$fichier2_o)
$fichier1_o:=File($doc_t;fk platform path)
  //futur nom du fichier
$nouveauNom_t:="___"+Generate UUID+$fichier1_o.extension
  //encore un peu de parano, c'est si bon
ASSERT(Test path name($folder_t+$nouveauNom_t)#Is a document;"un document du nom demandé existe déjà")
$fichier2_o:=$fichier1_o.rename($nouveauNom_t)
  //on ne s'en lasse pas
ASSERT(Test path name($folder_t+$nouveauNom_t)=Is a document;"le renommage il a merdé")

Capture d’écran 2020-05-09 à 12.35.02

Merci Arnaud de ton test.
J’ai donc adapté ton test *

C_OBJECT($fichier1_o;$fichier2_o)
C_TIME($documentOld_h)
C_TEXT($documentOld_t)

$documentOld_h:=Open document("")
$documentOld_t:=document   
$documentOld_o:=File($documentOld_t;fk platform path)
CLOSE DOCUMENT($documentOld_h)

$documentNew_t:=$documentOld_o.name+"_new"+$documentOld_o.extension
$documentNew_o:=$documentOld_o.rename($documentNew_t)

Plutôt, je faisais le contrôle en regardant l’objet File().
1- je n’écrivais pas sur un NAS mais sur une clé USB pour avoir un chemin d’accès simplifié à l’extrême
je n’arrive toujours pas à modifier sur la clé USB

2- j’ai fini par essayer sur mon disque et ça marche !
Je ne comprends pas l’échec sur la clé USB puisque MOVE DOCUMENT est opérationnel…
Ce sont tous les disques réseaux qui sont rejetés ?

Grand merci à toi !

  • ces smileys sont stupides ; je ne peux pas mettre : en fin de ligne !
    ** On ne va pas leur dire : ce n’était pas un apéro banal mais un Bas-Armagnac de derrière les fagots ; p…n, que c’est bon !
    *** Le markdown fait ce qu’il veut…

J’ai aussi cette erreur -45 avec :

$folder_t:=Convert path POSIX to system("/Volumes/divers/")  //NAS
$folder_t:=Convert path POSIX to system("/Volumes/USB8Go/")  //clé USB ExFAT
$folder_t:=Convert path POSIX to system("/Volumes/SSD250Go/")  //volume réseau smb
$folder_t:=Convert path POSIX to system("/Volumes/arnaud/Desktop/")  //volume réseau afp

Il n’y a que sur macHD que ça marche, apparemment oui, donc. Ça m’a l’air “pas prévu dans le manuel”, je ne vois rien sur le sujet du moins.

C’est dès qu’on fait espace suivi de deux points (idem avec espace insécable, hélas). Il suffit de faire échappement pour continuer une vie normale de claviériste français.

Oui, ils sont stupides, je me fais avoir à chaque fois car “:” ajoute le smiley. Une solution que j’ai trouvé, mettre “:” et un espace…