php "glob" et les données, la déduplication?

j'ai un php-application (par demande) numérisation pour l'existence de certains fichiers. (sur un partage réseau)

j'utilise glob pour cela, parce que d'habitude je connais juste le début du nom du fichier.

j'ai remarqué, que glob ne retourne pas les fichiers, qui sont actuellement ouverts par n'importe quel client, ainsi mon application pense file_xy n'existe pas, si quelqu'un l'a ouvert.

Est-il possible de faire glob retour ouvert (:= verrouillé?) les fichiers ainsi?

ce qui est étrange, c'est que ce n'est pas mentionné. Cependant, je peux confirmer que glob ne retourne pas les fichiers, qui sont actuellement ouverts par un client... (Dès que le client ferme l'application d'accès,glob sera de retour le fichier comme d'habitude)


ps.: même pas glob("servershare*") renvoie le fichier tant qu'il est ouvert. (Part de réseau permet le nombre maximum de concurrents les utilisateurs)


    $dir = opendir ("servershare");
    while ($file = readdir($dir)){
      echo $file."<br />";
    }

montre le fichier en question parfaitement bien, peu importe si ouvert par un autre client ou non. - Donc je peux presque exclure tout accès-limite / autorisation Machin...


j'ai trouvé cause même si je ne sais pas la raison maintenant:

Le Problème glob() ne pas trouver un fichier ouvert apparaît, lorsque le fichier est situé sur un lecteur qui utilise Windows Server 2012 R2 construire des données-fonctionnalité de déduplication.

Si je déplace le fichier vers un non dédupliquées partager, glob() pouvez le lire, même lorsqu'il est ouvert par plusieurs clients.


comme j'ai une alternative de travail, cette question devrait se concentrer principalement sur la question pourquoi glob ne fonctionne pas - ou disons travail différent ici. Il doit y avoir une différence dans la façon dont glob et readdir accèdent au système de fichiers sous-jacent pour déterminer le contenu.


Une Autre Preuve

il y a une autre preuve, que cela se rapporte à data-deduplication: j'ai configuré la fonctionnalité pour "seulement" des fichiers deduplicate de plus de 3 jours.

j'ai créé un cronjob, "ouvrir et Glober" un certain fichier sur le share. Une fois qu'il avait ~ 3 jours (Windows décide quand deduplicate), glob n'a pas réussi à lister le fichier alors qu'il était ouvert par un autre client.

ainsi, glob est capable de trouver des fichiers ouverts, qui ont a été copié sur le partage dans les 3 premiers jours - et commence alors à le manquer, une fois qu'il a été désduplé.

Observations

glob

glob échoue, l'origine de ce post :-)

scandir

en utilisant le scandir fonction même comportement:

  • fichier désduplicé ouvert par un client - manquant dans le résultat de l' tableau.
  • fichier désduplicé non ouvert par un client - partie du tableau résultant.

ouvrir / readdir

je veux soulignement encore une fois, que opendir et readdir fonctionne dans les deux cas.

RecursiveDirectoryIterator

cela a produit le résultat attendu à tout moment aussi bien.

Attributs Des Fichiers

j'ai noté, que les fichiers désduplicés sont affichés avec un " Size on Disque dur" de 0 Octets, alors que pas encore dédupliquées fichiers (qui sont réussi) sont affichées avec la taille, ils sont logiquement occupant (basé sur les systèmes de fichiers de cluster de taille):

toutefois, cela n'expliquerait pas pourquoi le fait qu'un dossier soit ouvert par un client ou non fait une différence. Un rapport de taille est égal à tout moment.

File Attributes of deduplicated and not deduplicated file

18
demandé sur dognose 2015-06-22 00:24:33

4 réponses

Je ne suis pas sûr que ce soit ce que vous cherchez mais j'utilise scandir() pour lister tous les fichiers dans un répertoire, vous pouvez exécution d'une commande une fois que vous connaissez le nom. Il fonctionnera sur les fichiers ouverts aussi bien

PHP scandir source de documentation

1
répondu AfikDeri 2015-06-26 12:32:46

cela a un certain sens si l'intention de la deduplication est de ne pas avoir de doublons, alors les fichiers sont verrouillés et php ne peut pas les voir. La seule chose à faire est de voir si cette limitation s'applique à scandir() et à la famille d'itérateurs répertoire/système de fichiers SPL. Si c'est le cas, il n'est peut-être pas possible d'en obtenir une liste.

Le seul autre choix serait d'utiliser exec() et une ligne de commande windows sorte de hack pour voir si vous pouvez obtenir une liste de fichiers, puis analyser les données en sortie. Cela peut être utile

php exec: ne renvoie pas la sortie

Bonne chance!

1
répondu ArtisticPhoenix 2017-05-23 11:51:18

Avez-vous essayé

$files = glob('{,.}*', GLOB_BRACE);

il est possible que la fonctionnalité data de-dupe garde le fichier ouvert comme un fichier caché.

1
répondu Rajat Garg 2015-07-01 21:11:25

préparez-vous à utiliser une autre fonction que glob()? Vous pouvez essayer d'utiliser les itérateurs récursifs de SPL s'il va trouver un fichier ouvert qui est situé sur un lecteur qui utilise Windows Server 2012 R2 construire dans la fonctionnalité Data-deduplication. Vous pouvez trouver un exemple de comment vous pouvez l'utiliser à partir de ce lien.

0
répondu 5ervant 2017-05-23 12:30:03