Écrire ce fichier à l'aide de CopyHere sans l'aide de WScript.Le sommeil
J'ai écrit un petit VBScript pour crée un .fichier zip et copier le contenu d'un dossier spécifié .fichier zip.
J'ai copier les fichiers un par un, pour une raison (je sais que je peux faire tout ça à la fois). Cependant, mon problème est que quand j'essaye de copier un par un sans WScript.Dormir entre chaque itération de boucle, je reçois un "Fichier non trouvé ou pas l'autorisation de lecture." erreur; si je place un WScript.Sleep 200
après chaque écriture, il fonctionne, mais pas 100% du temps.
Assez bien que j'aimerais me débarrasser de la fonction de Sommeil et ne pas compter sur ce que selon la taille du fichier, il peut prendre plus de temps pour écrire donc 200 millisecondes peut-être pas assez etc.
Comme vous pouvez le voir avec le petit morceau de code ci-dessous, je boucle sur les fichiers, puis, s'ils correspondent à l'extension de je de les placer dans l' .zip (zipFile)
For Each file In folderToZip.Items
For Each extension In fileExtensions
if (InStr(file, extension)) Then
zipFile.CopyHere(file)
WScript.Sleep 200
Exit For
End If
Next
Next
Des suggestions sur comment je peux cesser de compter sur la fonction de Veille?
Grâce
Non, vous ne pourriez pas utiliser la matrice de toute autre manière que l'itération et à en faire quasiment la même chose. Qu'en copiant le passé fichiers dans un dossier temp et ajoutez-les tous à la fois, à partir de là?
Ne sais pas si ça va faire une différence. Je pense que je pourrais obtenir la même erreur que la copie d'un fichier. Comment voulez-vous ajouter en une seule fois, si?
Par copier/déplacer le dossier de l'objet, et non pas les fichiers à l'intérieur. Juste une pensée. Vous pouvez aussi tout simplement essayer et de vivre avec elle: Ensemble
On Error Resume Next
/On Error GoTo 0
autour du défaut de déclaration et boucle tant qu'il y a une erreur. Pas particulièrement agréable, je le sais. :-\OriginalL'auteur mlevit | 2010-05-22
Vous devez vous connecter pour publier un commentaire.
C'est comment nous le faisons en VB6. Après l'appel de
CopyHere
sur le zip de nous attendre pour async compression pour terminer comme çaoù la fonction d'assistance ressemble à ceci
Agréable effet secondaire est que, même si la compression échoue, cela ne finiront pas dans une boucle infinie.
Le problème vient lors de l'accès au fichier zip quand il est fermé par zipfldr.dll quand pvCanOpenExclusive renvoie la valeur true.
Vous êtes en supposant que beaucoup sur ce shell va faire. Vous êtes en supposant qu'il ne s'ouvrent qu'une fois le fichier, et qu'il va le faire a l'instant où vous commencez la copie (et non pas, disons, une demi-seconde plus tard, après l'évaluation de la source de propriétés du répertoire)
Oui, c'est totalement hacky et n'est généralement pas une démarche de travail. On peut utiliser
IDropTarget
interface bien de compresser les fichiers de manière synchrone comme ceci.OriginalL'auteur wqw
Vous sont corrects, CopyHere est asynchrone.
Quand je fais cela dans un script vbscript, je dors jusqu'à ce que le nombre de fichiers dans le zip, est supérieure ou égale au nombre de fichiers copiés.
OriginalL'auteur Cheeso
Vous pouvez essayer d'accéder au fichier que vous venez de copier, par exemple avec un "il existe" vérifier:
Je ne suis pas sûr si
target
est calculé correctement pour ce contexte d'utilisation, mais vous obtenez l'idée. Je suis un peu surpris de voir que cette erreur se produit en premier lieu...FileSystemObject
devrait être strictement synchrone.Si tout le reste échoue, faites ceci:
Peut-être que la comparaison des tailles de fichier est le chemin à parcourir?
J'ai aimé cette idée, alors j'ai essayé, mais le problèmes devient évident lorsque vous atteignez les fichiers d'environ 20 KO ou plus. Parce que je suis de placer les fichiers dans un fichier ZIP de leur taille rétrécit donc je ne peut pas estimer le fichier ZIP taille avec ce fichier dans ma boucle devient infinie.
Certes, je n'ai jamais vraiment utilisé le FileSystemObject avec des dossiers zip, je ne savais même pas que c'était possible. Je peux seulement supposer que la fonction de l'API qui copie un fichier dans un dossier zip fonctionne différemment de la normale "copier le fichier" fonction de l'API, et retourne un peu trop tôt. Peut-être il n'y a pas d'autre moyen que d'attendre assez longtemps, ou de continuer à essayer jusqu'à ce que l'erreur disparaisse (via
On Error Resume Next
). N'oubliez pas d'inclure un compteur pour éviter une boucle infinie. 😉Le script fait continue de fonctionner après l'erreur est affiché mais le fichier destiné à être copié lorsque l'erreur est de montrer à ne pas être copiés à travers. Cela devient tellement ennuyeux 😛
OriginalL'auteur Tomalak
La solution que nous avons utilisée après beaucoup de débogage et d'assurance qualité sur les différentes fenêtres de saveurs, y compris lente et rapide des machines et des machines à sous forte charge CPU a l'extrait de code suivant.
Critique et amélioration de bienvenue.
Nous n'avons pas été en mesure de trouver un moyen de le faire sans une boucle, qui est, si vous voulais faire un peu de validation ou de post-compression de travail.
L'objectif était de construire quelque chose qui a couru de manière fiable sur autant de windows saveurs que possible. De préférence en mode natif en tant que possible.
Noter que ce code n'est PAS encore fiable à 100% mais sa semble être d'environ 99%. Aussi stable que nous avons pu obtenir avec le développement et d'assurance qualité de temps disponible.
Il est possible que l'augmentation de
iSleepTime
pourrait le rendre 100%Points à noter:
iSleepTime
ne doit pas être réduit, il semble que le plus souvent, la boucle s'exécute, plus la probabilité d'une erreur, apparemment liés à des opérations internes de la zip/processus de copieiFiles
est la source de nombre de fichiersoZippp.Items().Count
dans la boucle causé inexplicable erreurs qui ressemblait à celui qu'ils pourraient être liés à l'accès aux fichiers/partage/verrouillage des violations. Nous n'avons pas de passer du temps de traçage pour le savoir.Vous auriez probablement souhaitez ajouter un délai d'attente dans la boucle, pour éviter les boucles infinies
OriginalL'auteur Kyle
Ici est un truc que j'ai utilisé dans VB; obtenir la longueur du fichier zip avant de le changer et d'attendre qu'elle change alors d'attendre une seconde ou deux. J'ai seulement besoin de deux fichiers spécifiques, mais vous pourriez faire une boucle.
OriginalL'auteur user2135058