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.
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
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!
Avez-vous essayé
$files = glob('{,.}*', GLOB_BRACE);
il est possible que la fonctionnalité data de-dupe garde le fichier ouvert comme un fichier caché.
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.