OVH Cloud OVH Cloud

FileCopy, Copy

6 réponses
Avatar
Via
Bonsoir à tous,

l'instruction FileCopy génère une erreur quand le fichier mis en source
est ouvert.
J'ai essayé de la remplacer par la méthode Copy, en écrivant ceci :

Dim fs
'...
Set fs = CreateObject("Scripting.FileSystemObject")
fs.Copy gCheminBase & LibraryDirectory & AncienNomFichier, gCheminBase &
LibraryDirectory & FileInLibraryName
Set fs = Nothing

J'ai une erreur 438 : "l'objet ne gère pas cette propriété ou cette
méthode" en retour. Pas cool.
Peut-on m'indiquer mon erreur ? Je ne vois pas...
Merci d'avance,

Via :)

6 réponses

Avatar
Zoury
Salut Via!

: J'ai essayé de la remplacer par la méthode Copy
<snip>
: J'ai une erreur 438 : "l'objet ne gère pas cette propriété ou cette
: méthode" en retour. Pas cool.
<resnip>
: Peut-on m'indiquer mon erreur ? Je ne vois pas...

la méthode Copy n'existe tous simplement pas. ;O)

la méthode fournit par le FSO est CopyFile... mais je doute que cela fonctionne
plus.. si le fichier est ouvert tu auras une erreur. A moins, je crois, qu'il
soit ouvert avec un partage quelconque qui permette l'ouverture "multiples" de
ce dernier...

une solution acceptable serait alors d'avertir l'utilisateur que le fichier est
présentement ouvert et qu'il doit le fermer (cette n'est peut-être pas
applicable... je ne connais pas du tout les détails de ton appli ;O))


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
BDBull
Ce serait pas plutôt CopyFile au lieu de FileCopy ? Normalement ça doit
marcher...

La méthode Copy c'est normal qu'elle ne marche pas dans ton code. Tu devrais
avoir un truc du genre :
...
Set fs = CreateObject("Scripting.FileSystemObject")
Set InputFile = fs.GetFile ("C:SOURCE.XXX")
InputFile.Copy ("C:TARGET")
...

bàt.

"Via" a écrit dans le message de
news:
Bonsoir à tous,

l'instruction FileCopy génère une erreur quand le fichier mis en source
est ouvert.
J'ai essayé de la remplacer par la méthode Copy, en écrivant ceci :

Dim fs
'...
Set fs = CreateObject("Scripting.FileSystemObject")
fs.Copy gCheminBase & LibraryDirectory & AncienNomFichier, gCheminBase &
LibraryDirectory & FileInLibraryName
Set fs = Nothing

J'ai une erreur 438 : "l'objet ne gère pas cette propriété ou cette
méthode" en retour. Pas cool.
Peut-on m'indiquer mon erreur ? Je ne vois pas...
Merci d'avance,

Via :)




Avatar
Via
Salut Zoury :)

Je ne l'ai pas inventé : je copie-colle de la MSDN :


Copy, méthode
Description

Copie un fichier ou un dossier spécifié d'un emplacement vers un autre.

Syntaxe

object.Copy destination[, overwrite]

La syntaxe de la méthode Copy comprend les éléments suivants :

Élément Description
object Correspond toujours au nom d'un objet File ou Folder.
destination Destination de la copie du fichier ou du dossier. Les
caractères génériques ne sont pas autorisés.
overwrite Facultatif. Valeur booléenne True (par défaut) si les
fichiers ou dossiers existants sont remplacés ; False s'ils ne le sont pas.


Remarques

Le résultat de la méthode Copy sur un objet File ou Folder est identique à
celui de FileSystemObject.CopyFile ou FileSystemObject.CopyFolder où le
fichier ou le dossier référencé par object est passé en argument. Notez
cependant que ces méthodes alternatives sont capables de copier plusieurs
fichiers ou dossiers.



Je vais essayer les autres mais effectivement ça m'étonnerait que ça ne
provoque pas d'erreur si le fichier est ouvert... c'est juste par acquis de
conscience :)
J'ai déjà un avertissement pour mon utilisateur sur mon appli... mais ce
n'est pas pratique parce que ce sont des fichiers en réseau, donc ça peut
parfaitement être un autre utilisateur qui ouvre ce fichier... y a-t-il un
moyen de savoir lequel ? Voire de forcer la fermeture du fichier ???
Merci d'avance,

Via :)

"Zoury" a écrit dans le message de news:

Salut Via!

: J'ai essayé de la remplacer par la méthode Copy
<snip>
: J'ai une erreur 438 : "l'objet ne gère pas cette propriété ou cette
: méthode" en retour. Pas cool.
<resnip>
: Peut-on m'indiquer mon erreur ? Je ne vois pas...

la méthode Copy n'existe tous simplement pas. ;O)

la méthode fournit par le FSO est CopyFile... mais je doute que cela


fonctionne
plus.. si le fichier est ouvert tu auras une erreur. A moins, je crois,


qu'il
soit ouvert avec un partage quelconque qui permette l'ouverture


"multiples" de
ce dernier...

une solution acceptable serait alors d'avertir l'utilisateur que le


fichier est
présentement ouvert et qu'il doit le fermer (cette n'est peut-être pas
applicable... je ne connais pas du tout les détails de ton appli ;O))


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/



Avatar
Zoury
: object Correspond toujours au nom d'un objet File ou Folder.

aaaaaahhh!! Dans ton exemple de code, tu utilises la métode Copy sur un objet
FileSystemObject et non sur un objet File ou Folder...


: J'ai déjà un avertissement pour mon utilisateur sur mon appli... mais ce
: n'est pas pratique parce que ce sont des fichiers en réseau, donc ça peut
: parfaitement être un autre utilisateur qui ouvre ce fichier...

Quels sont les fichiers? sont-ils ouvert par ton logiciel? Il y a peut-être une
façon de forcer le fichier à s'ouvrir avec un partage.


: y a-t-il un moyen de savoir lequel ?

Yep. regarde cette article de Randy, je crois que c'est son addition la plus
récente ;O) :

Obtaining Open File Information from Another Machine
http://www.mvps.org/vbnet/code/network/netfileenum.htm


: Voire de forcer la fermeture du fichier ???

C'est possible... si ça existe (ce qui m'étonnerais mais sait-on jamais..) il
faudrait *vraiment* s'assurer que l'utilisateur ne perde pas le travaille qu'il
est en train d'effectuer........... De plus ce serait agaçant à mon avis..


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Via
> aaaaaahhh!! Dans ton exemple de code, tu utilises la métode Copy sur un


objet
FileSystemObject et non sur un objet File ou Folder...




Ben... voui :
Set fs = CreateObject("Scripting.FileSystemObject")
fs.Copy gCheminBase & LibraryDirectory & AncienNomFichier, gCheminBase & _
LibraryDirectory & FileInLibraryName

Ca me paraissait clair :)


: J'ai déjà un avertissement pour mon utilisateur sur mon appli... mais


ce
: n'est pas pratique parce que ce sont des fichiers en réseau, donc ça


peut
: parfaitement être un autre utilisateur qui ouvre ce fichier...

Quels sont les fichiers? sont-ils ouvert par ton logiciel? Il y a


peut-être une
façon de forcer le fichier à s'ouvrir avec un partage.




Non, ouverts par Word ou par Acrobat Reader, mais par l'intermédiaire d'un
ShellExecute de mon programme... si on peut l'ouvrir en partage, je veux
bien, mais ça me paraît difficile si c'est un .doc qu'un autre utilisateur
veut modifier. Mais je suis preneur si ça existe :)

: y a-t-il un moyen de savoir lequel ?

Yep. regarde cette article de Randy, je crois que c'est son addition la


plus
récente ;O) :

Obtaining Open File Information from Another Machine
http://www.mvps.org/vbnet/code/network/netfileenum.htm




Sympathique, je vais me pencher là-dessus.

: Voire de forcer la fermeture du fichier ???

C'est possible... si ça existe (ce qui m'étonnerais mais sait-on jamais..)


il
faudrait *vraiment* s'assurer que l'utilisateur ne perde pas le travaille


qu'il
est en train d'effectuer........... De plus ce serait agaçant à mon avis..




Effectivement... au pire je me démerderai autrement :)
Merci,

Via :)
Avatar
Zoury
: > aaaaaahhh!! Dans ton exemple de code, tu utilises la métode Copy sur un
objet
: > FileSystemObject et non sur un objet File ou Folder...
<snip>
: Ca me paraissait clair :)

Oui .. mais tu ne sembles pas comprendre ce que je t'ai expliqué.. tu obtiens
une erreur 438 : "l'objet ne gère pas cette propriété ou cette méthode". Cette
erreur vient du fait que tu n'utilises pas le bon objet pour appeler la méthode
Copy. Il faudrait plutôt quelque chose comme ceci :

<non testé>
'***
Call
CreateObject("Scripting.FileSystemObject").GetFile("c:file.txt").Copy(gCheminBa
se & LibraryDirectory & FileInLibraryName, True) ' Écrase le fichier s'il existe
déjà
'***
</non testé>

mais il me semble que le FSO ne gère les pas les fichiers binaires.. tu auras
peut-être des problèmes pour copier des fichiers .doc et .pdf.

aussi j'vais chercher voir si c'est possible d'ouvrir un fichier par
ShellExecute avec un accès partagé. ;O)

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/