IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Déplacement de fichiers trop longs


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut Déplacement de fichiers trop longs
    Salut à tous,

    voici ma question :
    j'utilise la fct MoveFile (http://delphi.developpez.com/faq/?pa...eplacerfichier ) pour deplacer des fichiers (photos) d'un repertoire à un autre (tous deux dans un même lecteur).

    Il s'agit d'un déplacement et non d'une copie.
    Lorsque l'on fait cela manuellement avec l'explorer, ça prend 1 seconde pour que les fichiers selectionnés se retrouvent dans le dossier de destination.

    Or lorsque je lance ma routine (une boucle for qui balaie un TStringList contenant tous le chemins source) le temps d'execution est tres long (plusieures minutes pour une centaine de photos, à 5Mo de moyenne par photo). De plus, le disque dur est en pleine activité d'écriture.

    J'en conclu donc que cette méthode, contrairement à un simple glisser/déplacer dans l'explorer écrit une copie de chaque fichier dans le dossier de destination puis efface celui de la source.

    Comment faire pour éviter la recopie des fichiers et obtenir un simple déplacement ?

    Merci pour votre aide

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    J'en conclu donc que cette méthode, contrairement à un simple glisser/déplacer dans l'explorer écrit une copie de chaque fichier dans le dossier de destination puis efface celui de la source
    ... effectivement l'aide dit bien à propos du flag MOVEFILE_COPY_ALLOWED :
    MOVEFILE_COPY_ALLOWED
    If the file is to be moved to a different volume, the function simulates the move by using the CopyFile and DeleteFile functions. Cannot be combined with the MOVEFILE_DELAY_UNTIL_REBOOT flag.
    ... reste plus qu'à trouver un remède pour accélérer.
    ... faudrait pouvoir trouver une combine dans laquelle le fichier-gravé-sur-disque reste à sa place en ne modifiant que l'intitulé du chemin qui conduit vers lui et dans ce cas le 'Move' serait quasi-instantané.

    A+

    EDIT du 13/01/2008 - 14h59 : Au fait au lieu d'utiliser ton 'Move' essaye donc de voir ce que donnerait tout simplement l'utilisation de la fonction RenameFile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       RenameFile('C:\CheminSouce\MonFichier.bmp', 'C:\CheminDestination\MonFichier.bmp');
    ... en encadrant ce RenameFile avec des if FileExists() pour éviter un conflit pouvant résulter de l'existance préalable d'un fichier nommé 'MonFichier.bmp' dans le répertoire de destination et pour éviter de renommer un 'MonFichier.bmp' qui n'existerait pas dans le répertoire-source.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Problème résolu.
    Merci cher Gilbert

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    j'ai un peu honte (très même), mais je ne voudrais pas laisser une fausse idée sur l'utilisation de MoveFile.
    En fait cette fonction marche très bien pour déplacer des fichier et ne provoque pas de ralentissements dus à une écriture. On obtient des résultats aussi rapides qu'avec un déplacer dans l'explorer.
    La longueur de mon traitement était due au fait qu'en aval du déplacement je relisais le fichier pour en afficher une vignette...
    Mes premiers tests portant sur trois photos, je n'ai pas "senti" le problème, surtout que d'une compilation à l'autre les fichiers restaient certainement dans la RAM. Par contre en essai grandeur nature le problème est apparu et je l'ai faussement imputé à la fct de déplacement.

    Mea culpa

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    j'ai un peu honte
    ... y'a vraiment pas de quoi, on arrive tous à se faire piéger.

    MoveFile : On obtient des résultats aussi rapides qu'avec un déplacer dans l'explorer
    ... mais comme MoveFile = CopyFile + Delete, t'as chronométré pour comparer avec le RenameFile qui lui ne modifie que le chemin d'accès aux fichiers et qui devrait donc être encore plus rapide ?

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Eh bien je n'ai pas été jusqu'à chronométrer
    tout simplement parce que le résultat est immédiat.
    ...et identique à un RenameFile.

    voici ma syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if not  movefile(Pchar(ListboxFiles.Strings[i]),
                  Pchar(IncludeTrailingPathDelimiter(RepACreer)+ExtractFileName(ListboxFiles.Strings[i])))
                    then log(fichier+ ' non déplacée,déja existante.');
    comme le volume ne change pas, ça doit opérer comme un renommage simple, comme dans ta remarque :
    MOVEFILE_COPY_ALLOWED
    If the file is to be moved to a different volume, the function simulates the move by using the CopyFile and DeleteFile functions. Cannot be combined with the MOVEFILE_DELAY_UNTIL_REBOOT flag.
    a+

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-salut,

    Eh bien je n'ai pas été jusqu'à chronométrer
    tout simplement parce que le résultat est immédiat.
    ... et identique à un RenameFile.
    ... dommage pour l'absence de chrono (temps-écoulé-en-ms = GetTickCount - Strart où Start et temps écoulé type DWord)
    ... mais si le résultat est "immédiat" ça se comprend.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. unix to AS400 : nom de fichiers trop long
    Par funfox dans le forum AS/400
    Réponses: 4
    Dernier message: 05/03/2009, 09h35
  2. Nom de fichier trop long (nombreux fichiers)
    Par gretch dans le forum Windows XP
    Réponses: 10
    Dernier message: 14/03/2008, 17h09
  3. Fichier trop long
    Par top_eagle dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 22/06/2007, 19h07
  4. [Upload] Temps d'upload d'un fichier trop long
    Par tylerphp dans le forum Langage
    Réponses: 4
    Dernier message: 13/12/2006, 11h59
  5. getOutputStream() : nom de fichier trop long
    Par joseph_p dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/06/2006, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo