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

Lazarus Pascal Discussion :

Upload de fichiers verrouillés sous Windows [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Upload de fichiers verrouillés sous Windows
    Bonjour,

    Je travaille avec Synapse sous Win 7. Je veux uploader quelques fichiers. Je rencontre un problème avec les fichiers verrouillés.
    The sharing mode parameter in the CreateFile function used to open files determines file-sharing. Files can be opened to allow sharing the file for read, write, or delete access. Subsequent attempts to open the file must be compatible with all previously granted sharing-access to the file. When the file is closed, sharing-access restrictions are adjusted to remove the restrictions imposed by that specific file open. Source
    Ainsi par exemple dans un répertoire à uploader, un project1.exe (compilé avec FPC) en train de s'exécuter sur le poste Client peut être uploadé vers le serveur FTP... mais pas un fichier Sansnom1.odt ouvert.

    Existe-t-il une solution en Lazarus pour déterminer le mode de "verrouillage à l'ouverture" des fichiers Windows ? Je n'ai rien vu. Mais je crois me rappeler que CopyFile rencontre "déjà" ce problème.

    Je suppose qu'il est nécessaire de passer par les API puisqu'un copier-coller à partir de Windows est possible sur le fichier Sansnom1.odt ouvert. Et là, cela va se compliquer sérieusement entre les Windows 32 et 64 bits et peut-être même entre les versions de Windows (XP ou 7).

    Donc en Lazarus... une "ruse" cachée, le "complément" d'un FileOpen ?

    Merci. Cordialement.
    Gilles
    Dernière modification par Invité ; 08/02/2012 à 17h43.

  2. #2
    Invité
    Invité(e)
    Par défaut
    OK sans utiliser les API, il est possible de détecter le blocage avec les TFileStream... et également de forcer une copie.
    Cordialement. Gilles
    Dernière modification par Invité ; 09/02/2012 à 13h53.

  3. #3
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,

    Par curiosité et bien que le sujet soit clos, j'ai repris votre exemple et j'ai constaté presque les mêmes choses, à savoir :
    CopyFile fonctionne pour un exécutable démarré mais pas un fichier *.odt (j'utilise LibreOffice 3.4.5).
    FileOpen, FileCreate, FileRead, FileWrite et FileClose fonctionnent si le fichier source a été ouvert avec le paramètre fmShareDenyNone, mais pas avec le paramètre fmOpenRead.
    Dans ce dernier cas, le fichier peut être ouvert mais pas lu...

    Pour information, en espérant que cela aidera...
    --
    Philippe.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    pour les .odt, on peut procéder ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    function isLockedFile(aFile : String) : Boolean;
    var
     aFS : TFileStream;
    begin
     Result := False;
     try
      aFS := TFileStream.Create(aFile, fmOpenRead);
      aFS.Free;
     except
      Result := True;
     end;
    end;
     
    function myCopy(aFileSrc, aFileDst : String) : Boolean;
    var
     nTmp : int64;
     aFSsrc, aFSdst : TFileStream;
    begin
     Result := True;
     try
      aFSsrc := TFileStream.Create(aFileSrc, fmOpenRead or fmShareDenyNone);
      try
       aFSdst := TFileStream.Create(aFileDst, fmCreate);
       try
        nTmp := aFSdst.CopyFrom(aFSsrc, 0);
       except
        Result := False;
       end;
      except
       Result := False;
      end;
     finally
      if Assigned(aFSdst) then aFSdst.Free;
      if Assigned(aFSsrc) then aFSsrc.Free;
     end;
    end;
     
    procedure TForm1.Button1Click(Sender : TObject);
    begin
     Showmessage('LockedFile : ' + BoolToStr(isLockedFile('Sans nom1.odt')));
     Showmessage('FileCopy : ' + BoolToStr(myCopy('Sans nom1.odt','Sans nom2.odt')));
    end;
    En supposant le fichier Sans nom1.odt ouvert :
    • la fonction isLockedFile détecte bien que le fichier Sans nom1.odt est ouvert (-> -1),
    • la fonction myCopy copie Sans nom1.odt (en le laissant ouvert) en Sans nom2.odt.

    Merci pour votre aide.
    Cordialement. Gilles
    Dernière modification par Invité ; 10/02/2012 à 17h01. Motif: Précisions

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

Discussions similaires

  1. Importer un gros fichier SQL sous windows
    Par bigsister dans le forum Outils
    Réponses: 2
    Dernier message: 24/08/2007, 15h17
  2. fichier log sous windows server2003
    Par 3wicha dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 08/06/2007, 15h46
  3. Réponses: 4
    Dernier message: 18/05/2006, 15h00
  4. Afficher un fichier binaire sous Windows
    Par Atomikx dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 14/12/2004, 00h29

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