OneDrive « Fichiers à la demande » et applications métier — les hypothèses que les espaces réservés brisent, et comment y faire face

· · OneDrive, Fichiers à la demande, KFM, Windows, Applications métier, Stockage cloud, Système de fichiers, Dépannage, Systèmes d'information

« Une application métier ne peut pas lire un CSV que j’ai enregistré sur le Bureau. » « Un import qui fonctionnait échoue avec “fichier introuvable” après un remplacement de PC. » « L’Explorateur montre le fichier, mais l’ouvrir depuis l’application produit une erreur. » — Ces dernières années, ce type de consultation de clients est devenu un classique.

Quand on enquête, la cause n’est souvent pas un bogue d’application mais la « sauvegarde automatique du Bureau et des Documents » de OneDrive (Known Folder Move, KFM) et les « Fichiers à la demande ». Le vrai Bureau a été déplacé vers C:\Users\<nom>\OneDrive\Desktop, et une partie des fichiers que l’on y voit sont des « espaces réservés » sans contenu local. Les utilisateurs et l’informatique continuent d’utiliser le PC sans remarquer ce changement.

Autrement dit, l’hypothèse implicite d’une application métier selon laquelle « le fichier est sur le disque local » a, sans que personne ne l’ait décidé, été remplacée par l’hypothèse que « le fichier est dans le cloud, et localement il n’y a que l’apparence ». Destiné aux responsables informatiques des PME et aux développeurs d’applications Windows, cet article organise, à partir des sources primaires Microsoft Learn, le fonctionnement des espaces réservés, la façon de juger l’état d’après les attributs de fichier, les pièges typiques dans lesquels une application métier marche, ce que le côté développement et le côté informatique peuvent faire, et une procédure de triage lorsque l’on vous dit « le fichier ne s’ouvre pas ».

Remplacement de l'hypothèse implicite d'une application métierL'hypothèse implicite d'une application métier que le fichier est sur le disque local a, sans que personne ne l'ait décidé, été remplacée par l'hypothèse que le contenu réel est dans le cloud et que localement il n'y a que l'apparenceL'hypothèse implicite traditionnelleContenu réel sur le disque localL'hypothèse remplacéeLe contenu réel est dans le cloudLocalement il n'y a que l'apparenceUn espace réservé

Figure 1 : L’hypothèse que « le contenu réel est local » a, sans que personne ne l’ait décidé, été remplacée par « le contenu réel est dans le cloud ; localement il n’y a que l’apparence ».

1. D’abord la conclusion

  • Le Bureau, Documents et Images peuvent avoir été déplacés sous C:\Users\<nom>\OneDrive\ par le KFM. Cela tend à s’activer lors de la configuration initiale d’un nouveau PC, et une organisation peut aussi l’appliquer en masse par stratégie. Une application qui suppose un chemin fixe casse ici.1
  • Les Fichiers à la demande sont activés par défaut dans l’application de synchronisation actuelle. Les fichiers créés sur un autre appareil ou sur le Web apparaissent comme espaces réservés « en ligne uniquement » sans contenu local.23
  • La vraie identité d’un espace réservé est un point d’analyse géré par l’API Cloud Files (le minifiltre cldflt.sys). Il ressemble à un fichier ordinaire tant pour l’Explorateur que pour les API de fichiers, et l’ouvrir le télécharge (hydrate) automatiquement.4
  • L’état se juge d’après les attributs de fichier. FILE_ATTRIBUTE_OFFLINE, RECALL_ON_DATA_ACCESS, PINNED, UNPINNED et analogues sont les marqueurs, et la commande attrib les montre comme les lettres O, P et U. Contrôler les attributs seuls ne provoque pas de téléchargement.567
  • Les accidents typiques d’une application métier sont une combinaison de « ne s’ouvre pas », « lent », « attributs mal jugés », « tempête d’événements de surveillance » et « conflit avec la synchronisation ». Hors ligne ou avec OneDrive arrêté, l’hydratation échoue, et un traitement par lots induit le téléchargement de chaque fichier.48
  • La réponse côté application est de « respecter les espaces réservés ». Les bases sont de juger d’après les attributs à l’énumération et de ne pas ouvrir à la légère, d’utiliser FILE_FLAG_OPEN_NO_RECALL si besoin, et de ne pas placer le dossier de données sous OneDrive.910
  • La réponse côté informatique est « d’opérer avec des épingles » et « de contrôler par stratégie ». Garantissez le contenu réel des dossiers métier avec « Toujours conserver sur cet appareil », et configurez le KFM et les Fichiers à la demande exprès avec la stratégie de groupe / Intune. N’oubliez pas que le Contrôle d’espace de stockage peut aussi « renvoyer les fichiers inutilisés en ligne uniquement ».1112

En une phrase : « un fichier visible dans l’Explorateur » et « un fichier qui a un contenu réel sur le disque local » ne sont plus la même chose.

2. Ce qui se passe — le KFM et les Fichiers à la demande

2.1. Le Bureau n’est peut-être plus C:\Users\<nom>\Desktop

L’application de synchronisation OneDrive a une fonction appelée Known Folder Move (KFM). Sur l’écran des paramètres elle apparaît comme « Sauvegarde », « Sauvegarder des dossiers importants » et analogues ; lorsqu’elle est activée, le vrai Bureau, Documents et Images sont déplacés (redirigés) sous le dossier OneDrive.1

Emplacement vu par l’utilisateur Vrai chemin avant KFM Vrai chemin après KFM
Bureau C:\Users\taro\Desktop C:\Users\taro\OneDrive\Desktop
Documents C:\Users\taro\Documents C:\Users\taro\OneDrive\Documents
Images C:\Users\taro\Pictures C:\Users\taro\OneDrive\Pictures

Lors de la configuration initiale (OOBE) d’un nouveau PC, se connecter avec un compte Microsoft ou un compte professionnel présente largement la sauvegarde de dossiers comme proposition par défaut, et poursuivre tel quel l’active. Une organisation peut aussi l’appliquer en masse sans rien demander à l’utilisateur, avec la stratégie « Déplacer silencieusement les dossiers connus Windows vers OneDrive » (KFMSilentOptIn).111

Deux chemins par lesquels le KFM s'activeSe connecter avec un compte lors de la configuration initiale d'un nouveau PC présente la sauvegarde de dossiers comme proposition par défaut et poursuivre tel quel l'active ; dans une organisation la stratégie KFMSilentOptIn l'applique en masse sans demander à l'utilisateurConfiguration initiale d'un nouveau PCConnexion avec un compteLa sauvegarde est proposée par défautPoursuivre tel quel l'activeStratégie d'organisationKFMSilentOptInAppliqué en masse sans demanderKFM activé

Figure 2 : Le KFM s’active sans que personne ne le remarque, soit par la proposition par défaut à la configuration initiale, soit par la stratégie d’application silencieuse de l’organisation.

Le point gênant est que l’apparence dans l’Explorateur change à peine. Les API de dossiers connus du shell (SHGetKnownFolderPath et Environment.GetFolderPath de .NET) renvoient le chemin correct après déplacement, donc une application bien élevée continue de fonctionner. Ce qui casse, c’est une application qui incruste un chemin fixe tel que C:\Users\%USERNAME%\Desktop dans un fichier de paramètres ou dans le code. Le schéma typique d’un import qui échoue avec « fichier introuvable » après un remplacement de PC est celui-ci.

Comportement de la résolution de chemin après le KFMAprès que le KFM a déplacé le vrai Bureau et des dossiers analogues sous OneDrive, une application qui utilise les API de dossiers connus continue de fonctionner avec le chemin correct après déplacement, mais une application qui incruste un chemin fixe échoue avec fichier introuvableAPI de dossiers connusUn chemin fixe codé en durKFM activéLe vrai Bureau et analogues passent sous OneDriveComment l'application résout-elle le chemin ?Obtient le chemin correct après déplacement et continueFichier introuvable

Figure 3 : Après le KFM, une application qui utilise les API de dossiers connus continue de fonctionner, mais une application qui code en dur un chemin fixe casse ici.

2.2. Fichiers à la demande — visibles, mais sans contenu réel

L’autre piste est les Fichiers à la demande. Dans un environnement où ils sont activés, chaque fichier sur OneDrive est visible dans l’Explorateur, mais le contenu n’est pas téléchargé tant que le fichier n’est pas ouvert. Cette fonction est activée par défaut dans l’application de synchronisation actuelle, et Microsoft recommande aussi de la laisser activée.23

L’état se lit d’après les icônes d’état dans l’Explorateur.13

Icône État Contenu local
Marque nuage En ligne uniquement Aucun (espace réservé seulement)
Coche sur fond blanc Disponible localement Présent (mais peut plus tard être libéré automatiquement)
Coche blanche sur fond vert Toujours conserver sur cet appareil (épinglé) Présent (hors libération automatique)

L’important ici est l’état du milieu. Un fichier qui a été ouvert une fois et a maintenant un contenu local peut revenir en ligne uniquement par l’action « Libérer de l’espace » de l’utilisateur ou par le Contrôle d’espace de stockage, discuté plus loin. C’est une cause d’échec difficile à reproduire du genre « ça marchait le mois dernier ».312

Les trois états des Fichiers à la demande et les transitionsUn fichier en ligne uniquement devient disponible localement une fois ouvert, mais une action Libérer de l'espace ou le Contrôle d'espace de stockage peut le renvoyer en ligne uniquement, et seul un fichier épinglé est hors de la libération automatiqueOuvrir (hydratation)Libérer de l'espaceContrôle d'espace de stockageToujours conserver sur cet appareilToujours conserver sur cet appareilDésépinglerEn ligne uniquement (marque nuage)Disponible localementÉpinglé (Toujours conserver sur cet appareil)

Figure 4 : Les trois états des Fichiers à la demande. « Disponible localement » peut revenir automatiquement en ligne uniquement ; une épingle est hors de cela.

3. La vraie identité d’un espace réservé — l’API Cloud Files et les points d’analyse

Les Fichiers à la demande sont implémentés au-dessus d’un mécanisme d’OS introduit dans Windows 10 version 1709, l’API Cloud Files. L’unité de travail côté système de fichiers est un minifiltre de système de fichiers nommé cldflt.sys (nom de service CldFlt, « Windows Cloud Files Filter Driver »), et OneDrive est un « fournisseur de synchronisation » qui utilise cette API.47

Un espace réservé est techniquement un point d’analyse (reparse point). Sur le système de fichiers n’existent que des métadonnées telles que le nom, la taille et les horodatages (environ 1 Ko) ; il n’y a pas de données de contenu. Quand une application ouvre le fichier et lit, le minifiltre détecte la requête, dit au fournisseur de synchronisation de transférer les données, attend la fin du téléchargement, puis la lecture se poursuit. Cette récupération s’appelle hydratation ; jeter le contenu local et revenir à un espace réservé s’appelle déshydratation.4

Hydratation à l'ouverture d'un espace réservéQuand une application ouvre un espace réservé et lit, le minifiltre cldflt.sys détecte la requête, dit au fournisseur de synchronisation de transférer les données, attend la fin du téléchargement, puis la lecture se poursuitFournisseur de syncMinifiltre cldflt.sysApplication métierFournisseur de syncMinifiltre cldflt.sysApplication métierRequête d'ouverture et de lectureOrdonner un transfert de donnéesTéléchargement terminéLa lecture se poursuit

Figure 5 : Une lecture d’espace réservé se poursuit après que le minifiltre a fait récupérer les données par le fournisseur de synchronisation.

Entendre « point d’analyse » fait craindre la compatibilité avec du code existant qui « traite spécialement un point d’analyse s’il en détecte un », mais pour la compatibilité l’API Cloud Files cache le fait que c’est un point d’analyse à tous sauf le moteur de synchronisation et les processus sous %systemroot%. Depuis une application ordinaire, cela ressemble à « un fichier ordinaire juste un peu lent à ouvrir ». Cette transparence poussée est, en même temps qu’elle est commode, aussi la raison pour laquelle « l’application a ses hypothèses brisées sans s’en apercevoir ».4 Le mécanisme des points d’analyse eux-mêmes est expliqué dans « Les profondeurs de l’I/O Windows (partie 5) ».

Masquage du point d'analyse, et différence d'apparenceLa vraie identité d'un espace réservé est un point d'analyse, mais l'API Cloud Files le cache aux processus autres que le moteur de synchronisation, donc depuis une application ordinaire cela ressemble à un fichier ordinaire juste un peu lent à ouvrirLe moteur de sync et analoguesToute autre applicationEspace réservé (point d'analyse)Quel processus l'a ouvert ?Visible comme point d'analyseRessemble à un fichier ordinaireSemble seulement un peu lent à ouvrir

Figure 6 : Le fait que c’est un point d’analyse est caché à tous sauf le moteur de synchronisation, et à une application ordinaire cela ressemble à un fichier ordinaire.

Dans les propriétés de l’Explorateur, un espace réservé a l’apparence caractéristique que « Taille » montre la taille d’origine, tandis que « Taille sur le disque » est presque 0. L’hypothèse que « il a une taille, donc il doit avoir un contenu réel » ne tient pas ici.

Apparence d'un espace réservé dans les propriétésDans les propriétés de l'Explorateur un espace réservé montre la taille d'origine comme Taille tandis que Taille sur le disque est presque 0, donc l'hypothèse qu'il a une taille et doit donc avoir un contenu réel ne tient pasPropriétés de l'espace réservéTaille est la taille d'origineTaille sur le disque presque 0L'hypothèse qu'il y a un contenu réelIl n'y a pas de contenu local

Figure 7 : Un espace réservé montre la taille d’origine comme « Taille » tandis que « Taille sur le disque » est presque 0.

4. Les attributs de fichier vous disent l’état

L’état d’espace réservé est publié comme attributs de fichier ordinaires. Les principaux sont les suivants.5

Attribut Valeur Signification
FILE_ATTRIBUTE_OFFLINE 0x00001000 Les données ne sont pas immédiatement disponibles (l’attribut traditionnel de la gestion de stockage hiérarchique)
FILE_ATTRIBUTE_RECALL_ON_OPEN 0x00040000 Il n’y a pas de contenu local physique. N’apparaît que dans les résultats d’énumération de répertoire
FILE_ATTRIBUTE_PINNED 0x00080000 L’utilisateur entend « toujours le garder local » (épinglé)
FILE_ATTRIBUTE_UNPINNED 0x00100000 Le contenu local n’a pas besoin d’être conservé (l’intention de le rendre en ligne uniquement)
FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS 0x00400000 Une partie ou la totalité du contenu n’est pas locale. Lire provoque une récupération depuis le distant

La commande attrib de l’invite de commandes peut afficher et définir ceux-ci comme une seule lettre. O est l’attribut hors ligne, P est épinglé, U est désépinglé.6 La correspondance avec l’état des Fichiers à la demande OneDrive est organisée dans la documentation Microsoft comme suit.7

État Fichiers à la demande Attributs Commande pour définir
Toujours disponible (épinglé) Pinned (P est affiché) attrib +p <path>
Disponible localement Ni P ni U attrib -p <path>
En ligne uniquement Unpinned (U est affiché) attrib +u <path>

Un avertissement. Changer d’état a un ordre. Quand vous voulez qu’un fichier en ligne uniquement (U) devienne « disponible localement », exécuter -p seul laisse U posé et le contenu réel n’est pas récupéré. La documentation Microsoft montre aussi la procédure de d’abord faire +p (toujours disponible) pour télécharger le contenu réel puis -p.7 Dans un script qui doit basculer un état existant de façon fiable, il est plus sûr de effacer l’attribut opposé en même temps, comme dans attrib +p -u.

L'ordre pour passer de en ligne uniquement à disponible localementExécuter attrib -p seul sur un fichier en ligne uniquement laisse l'attribut U et le contenu réel n'est pas récupéré ; il faut d'abord télécharger le contenu réel avec attrib +p puis -pattrib -p seulementattrib +pattrib -pEn ligne uniquement (U)Reste U ; le contenu réel n'est pas récupéréÉpinglé (télécharger le contenu réel)Disponible localement

Figure 8 : Passer depuis en ligne uniquement exige l’ordre de d’abord récupérer le contenu réel avec +p puis -p.

Un exemple de jugement en PowerShell. Regarder les attributs seuls ne provoque pas d’hydratation, donc vous pouvez l’utiliser en confiance pour l’enquête et les contrôles en masse.

function Test-CloudPlaceholder {
    param([Parameter(Mandatory)][string]$Path)

    $value = [int](Get-Item -LiteralPath $Path -Force).Attributes

    [pscustomobject]@{
        Path               = $Path
        Offline            = ($value -band 0x00001000) -ne 0  # FILE_ATTRIBUTE_OFFLINE
        RecallOnDataAccess = ($value -band 0x00400000) -ne 0  # Le contenu n'est pas entièrement local
        Pinned             = ($value -band 0x00080000) -ne 0  # Toujours conserver sur cet appareil
        Unpinned           = ($value -band 0x00100000) -ne 0  # En ligne uniquement
    }
}

# Contrôle en masse des CSV sous le dossier Documents (le contenu n'est pas téléchargé).
# Résolvez le chemin avec l'API de dossiers connus. Codé en dur le nom d'affichage
# "Documents" peut devenir un chemin inexistant selon le vrai nom de dossier
# (Documents vs. un nom localisé) et la configuration KFM
Get-ChildItem ([Environment]::GetFolderPath('MyDocuments')) -Recurse -Filter *.csv |
    ForEach-Object { Test-CloudPlaceholder $_.FullName } |
    Where-Object RecallOnDataAccess |
    Format-Table -AutoSize

Le cast vers [int] vient de ce que l’énumération FileAttributes de .NET ne définit pas de noms tels que RECALL_ON_DATA_ACCESS. Des opérations bit à bit sur la valeur numérique permettent de juger sans ennui.

5. Les pièges dans lesquels une application métier marche

C’est le sujet principal. La transparence des espaces réservés est commode la plupart du temps, mais combinée à un schéma de traitement typique d’application métier elle affleure sous les six formes suivantes.

5.1. Ouvrir démarre automatiquement un téléchargement — « ne s’ouvre pas » hors ligne

Ouvrir un fichier en ligne uniquement démarre l’hydratation sur place. En ligne, avec un petit fichier, c’est si rapide que l’on ne le remarque pas, mais lorsque OneDrive est arrêté, déconnecté ou en pause, lorsque le réseau est en mauvais état, ou lorsque le fichier est volumineux, cela devient « un fichier qui existe mais ne s’ouvre pas ». L’erreur peut revenir comme un code de la famille cloud-file tel que ERROR_CLOUD_FILE_PROVIDER_NOT_RUNNING (0x8007016A, “The cloud file provider is not running”), ou être observée comme un délai d’attente côté application.8

Un piège supplémentaire est qu’un contrôle d’existence équivalent à File.Exists(), et l’obtention des attributs ou de la taille, réussissent. Vous obtenez un schéma d’erreur que l’intuition du disque local ne peut pas expliquer : « le contrôle d’existence a réussi, mais la lecture a échoué ».

Branches à l'accès à un fichier en ligne uniquementUn contrôle d'existence et l'obtention des attributs et de la taille réussissent, mais lire le contenu démarre l'hydratation ; si OneDrive tourne et que le réseau est sain on peut lire après le téléchargement, sinon on échoue avec une erreur telle que 0x8007016A ou un délai d'attenteOuiNonContrôle d'existence, ou obtention des attributs ou de la tailleRéussitLecture du contenuL'hydratation démarreOneDrive en cours et réseau sain ?Lisible après le téléchargementUne erreur telle que 0x8007016A, ou un délai

Figure 9 : Un contrôle d’existence peut réussir tandis qu’une lecture échoue. Le succès ou l’échec dépend de si OneDrive tourne et du réseau.

5.2. Un traitement par lots induit le téléchargement de chaque fichier

Pointer un lot qui lit chaque fichier d’un dossier, un calcul de hachage, une recherche plein texte ou une sauvegarde maison vers un arbre sous OneDrive et l’hydratation de chaque fichier que vous touchez est induite. Pour un dossier de plusieurs Go, le traitement devient anormalement lent, le téléchargement remplit aussi le disque, et sur un PC à faible capacité le manque d’espace libre invite une autre panne. La capacité que les Fichiers à la demande étaient censés économiser disparaît en une seule analyse complète.

De plus, si une application provoque une hydratation sans action explicite de l’utilisateur, Windows peut afficher un toast et donner à l’utilisateur le choix de bloquer. Une fois bloquée, cette application continue d’échouer les téléchargements par la suite (on peut lever cela avec « Téléchargements automatiques de fichiers » dans Paramètres). C’est une cause de « l’import échoue seulement sur un PC particulier ».4

Comment un lot induit le téléchargement de chaque fichierUn lot sous OneDrive induit l'hydratation de chaque fichier qu'il touche, causant un retard de traitement et une pression disque, et si l'utilisateur bloque sur le toast, les téléchargements continuent d'échouer ensuiteOuiNonUn lot sous OneDriveHydrater chaque fichier touchéRetard de traitement et pression disqueUn toast peut apparaîtreL'utilisateur a-t-il bloqué ?Les téléchargements échouent ensuiteLe téléchargement continue

Figure 10 : Un lot induit l’hydratation de chaque fichier, et s’il est bloqué sur le toast, les échecs continuent ensuite.

5.3. Mauvais comportement du code qui n’attend pas les attributs

Le code qui ne connaît pas FILE_ATTRIBUTE_OFFLINE ou RECALL_ON_DATA_ACCESS se comporte mal à des endroits inattendus.

  • Les attributs sont testés en égalité exacte (attributes == FileAttributes.Archive et analogues), donc un espace réservé est exclu ou traité comme une erreur en tant que « fichier inattendu »
  • Une décision d’exclusion dans un outil de sauvegarde ou de synchronisation interprète l’attribut OFFLINE comme « déjà envoyé sur bande » et saute (ou, à l’inverse, récupère chaque fichier qu’il aurait dû exclure)
  • Un contrôle en lecture seule ou une opération de bit d’archive casse la combinaison d’attributs
Schémas de mauvais comportement du code qui n'attend pas les attributsLe code qui ne connaît pas les attributs d'espace réservé se comporte mal comme exclusion ou gestion d'erreur par un test d'égalité exacte, saut ou récupération complète par une mauvaise interprétation de OFFLINE, ou casse de la combinaison d'attributsCode qui n'attend pas les attributsTest d'égalité exacteMal interprète OFFLINEUne opération d'attribut casse la combinaisonExclu ou en erreur comme inattenduSaut, ou une récupération complète

Figure 11 : Le code qui ne connaît pas OFFLINE ou les attributs de la famille RECALL se comporte mal comme exclusion, mauvais saut ou destruction d’attributs.

Les conseils de Microsoft pour les développeurs de minifiltres affirment clairement que l’on ne doit pas émettre une lecture ou une écriture négligente vers un fichier qui a RECALL_ON_DATA_ACCESS. Le document vise les pilotes noyau, mais le principe « toucher le contenu d’un fichier avec cet attribut = un coût de récupération se produit » s’applique tel quel à une application en mode utilisateur.10

5.4. Interaction entre FileSystemWatcher et la synchronisation

Surveiller un dossier sous OneDrive avec FileSystemWatcher et vous obtenez non seulement les actions de l’utilisateur mais aussi un grand nombre d’événements issus de l’activité de l’application de synchronisation. Chaque fois qu’une modification sur un autre appareil est synchronisée, et chaque fois que l’hydratation ou la déshydratation change les attributs ou la taille, un événement Changed peut se déclencher. De plus, une conception qui écrit le résultat d’une surveillance-et-import dans le même dossier devient une « tempête de notifications de changement » dans une boucle écriture → téléversement → mise à jour d’attributs → un autre événement. L’élagage des événements et la conception d’un contrôle de contenu réel sont traités dans « Guide pratique de FileSystemWatcher », mais sous OneDrive le besoin en est encore un cran plus haut.

Une boucle de notifications de changement par surveillance et réécritureSi une application de surveillance qui a reçu un événement de changement réécrit le résultat d'import dans le même dossier, le téléversement et la mise à jour d'attributs de l'application de sync déclenchent un autre événement, et cela devient une boucle — une tempête de notificationsÉvénement de changementL'application de surveillance importeRéécrire dans le même dossierL'application de sync téléverseLes attributs ou la taille sont mis à jourSync d'un changement depuis un autre appareil

Figure 12 : Réécrire le résultat d’import dans le même dossier devient une boucle dans laquelle l’activité de l’application de synchronisation produit un autre événement.

5.5. Conflits de synchronisation pendant un verrou exclusif, et fichiers « Copie »

Pendant qu’une application métier a un fichier ouvert avec un verrou exclusif, l’application de synchronisation ne peut ni téléverser ni mettre à jour ce fichier. Placer une application à verrou longuement tenu (un Access .accdb, un fichier de données dans un format maison, un fichier journal, et analogues) sous OneDrive rend les erreurs de synchronisation l’état normal. À l’inverse, lorsque le même fichier est édité sur plusieurs PC, l’application de synchronisation essaie de garder les deux éditions et produit un fichier en double avec un nom de PC ou une copie de conflit telle que « — copie ». Un import qui suppose « un dossier, un fichier » se comporte mal sur ce double. Pour les bases de la conception de verrou, voir « Les bases du contrôle d’exclusion pour l’intégration par fichiers ».

Problèmes de sync causés par un verrou exclusif et une édition multi-PCPendant qu'une application a un fichier ouvert avec un verrou exclusif l'application de sync ne peut pas mettre à jour et les erreurs de sync deviennent l'état normal ; éditer le même fichier sur plusieurs PC produit une copie de conflit et l'hypothèse un-dossier-un-fichier s'effondreL'application ouvre avec un verrou exclusifImpossible de sync ; les erreurs deviennent normalesLe même fichier est édité sur plusieurs PCUne copie de conflit est produiteUn double avec un nom de PC ou copieL'hypothèse un-dossier-un-fichier s'effondre

Figure 13 : Un verrou exclusif rend les erreurs de synchronisation l’état normal, et l’édition sur plusieurs PC invite un mauvais comportement dû à une copie de conflit.

5.6. L’antivirus et l’indexeur de recherche induisent l’hydratation

Ce n’est pas seulement l’application métier qui lit le contenu des fichiers. Une analyse complète par un logiciel antivirus, et l’indexeur de recherche, induisent aussi l’hydratation s’ils touchent le contenu d’un espace réservé. Microsoft Defender et des produits analogues sautent les fichiers qui ont l’attribut RECALL_ON_DATA_ACCESS au moment de l’analyse à la demande, mais c’est une réponse côté produit, et vous ne pouvez pas supposer que chaque produit de sécurité montrera le même soin. Si vous voyez des symptômes tels que « le réseau et le disque saturent chaque nuit à l’heure d’analyse » ou « des fichiers censés être en ligne uniquement se sont tous matérialisés d’ici le matin », suspectez cette piste.14

Hydratation induite par un produit de sécurité ou l'indexeur de rechercheQuand une analyse complète ou l'indexeur de recherche touche le contenu d'un espace réservé, un produit qui respecte l'attribut RECALL saute, mais un produit qui ne le fait pas hydrate chaque fichier et cause une pression de bande passante nocturne ou une matérialisation matinaleUn produit qui le respecteUn produit qui ne le fait pasUne analyse complète ou l'indexeur de rechercheRespecte l'attribut RECALL ?Saute l'espace réservéTouche le contenu et hydrateBande passante et disque saturent la nuitD'ici le matin les fichiers se sont tous matérialisés

Figure 14 : Une analyse qui ne respecte pas l’attribut induit l’hydratation de chaque fichier, et cela apparaît comme charge nocturne ou matérialisation matinale.

6. Réponse côté développement d’application — respecter les espaces réservés

La politique de base en tant que développeur est de traiter un espace réservé non comme « un fichier cassé » mais comme « un fichier qui a un coût de récupération ».

  • Jugez d’après les attributs à l’énumération, et n’ouvrez pas à la légère. Dans une analyse de dossier, confirmez d’abord d’après les attributs (le jugement du chapitre 4) s’il est en ligne uniquement, et n’ouvrez que les fichiers dont vous avez besoin du contenu. Donnez au traitement qui « n’est pas fatal s’il manque » — collecte de journaux, calcul de hachage, génération d’aperçu — l’option de sauter les espaces réservés.
// Définir comme nombres les valeurs que FileAttributes en .NET ne définit pas
const FileAttributes RecallOnDataAccess = (FileAttributes)0x00400000;
const FileAttributes RecallOnOpen       = (FileAttributes)0x00040000;

static bool IsCloudPlaceholder(FileAttributes attributes) =>
    (attributes & (RecallOnDataAccess | RecallOnOpen | FileAttributes.Offline)) != 0;

foreach (var file in new DirectoryInfo(watchFolder).EnumerateFiles("*.csv"))
{
    if (IsCloudPlaceholder(file.Attributes))
    {
        log.Warn($"{file.Name} est en ligne uniquement ; on saute cette fois");
        continue;
    }
    Import(file.FullName);
}
Le chemin de juger d'après les attributs à l'énumération puis d'ouvrirDans une analyse de dossier, confirmez d'abord les attributs à l'énumération ; s'il s'agit d'un espace réservé, sautez et laissez un journal d'avertissement, et n'exécutez l'import que sur les autres fichiers, afin d'éviter une hydratation négligenteOuiNonConfirmer les attributs à l'énumérationEspace réservé ?Sauter et laisser un journal d'avertissementExécuter l'importLa politique d'ouvrir seulement les fichiers dont on a besoin du contenu

Figure 15 : Jugez d’après les attributs à l’énumération et sautez un espace réservé sans l’ouvrir, afin d’éviter une hydratation négligente.

  • Notez que FILE_FLAG_OPEN_NO_RECALL n’est pas une garantie de « ne pas télécharger ». Spécifier cet indicateur sur CreateFile peut indiquer l’intention que « les données obtenues doivent être laissées côté distant et non réécrites vers le stockage local ». C’est toutefois un indicateur seulement pour ne pas rendre résidentes localement les données obtenues ; si vous lisez le contenu, le transfert de données lui-même se produit encore. Si vous voulez éviter la bande passante et la latence elles-mêmes, terminez avec les attributs, la taille et les horodatages seuls — ne demandez pas d’accès en lecture (ouvrez avec des droits d’accès 0, utilisez les métadonnées du résultat d’énumération). C’est le plus sûr.9
L'effet et les limites de FILE_FLAG_OPEN_NO_RECALLFILE_FLAG_OPEN_NO_RECALL est un indicateur pour ne pas rendre résidentes localement les données obtenues ; si vous lisez le contenu le transfert de données lui-même se produit encore, donc si vous voulez éviter le transfert le plus sûr est de terminer avec des métadonnées telles que les attributsOuvrir avec l'indicateur NO_RECALLLire le contenuUn transfert de données se produitCela ne devient pas résident localementTerminer avec les métadonnées seulesAucun transfert ; le plus sûr

Figure 16 : FILE_FLAG_OPEN_NO_RECALL empêche seulement de devenir résident localement ; si vous voulez éviter le transfert lui-même, terminez avec les métadonnées seules.

  • Mettez « ceci est sous OneDrive » dans le message d’erreur. Lors d’un échec de lecture, rien que confirmer si le chemin cible est sous %OneDrive% et l’inclure dans le message réduit fortement le temps de triage pour le terrain et le service d’assistance. Si vous détectez une erreur de la famille cloud-file telle que 0x8007016A, l’idéal est de dire à l’utilisateur « veuillez vérifier l’état de OneDrive ».
  • Ne placez pas le dossier de données de l’application sous OneDrive. Dans un environnement KFM, « Documents » est aussi sous OneDrive. Placez les paramètres, la base de données et les fichiers de travail de l’application dans %ProgramData% ou %LocalAppData%, et ne choisissez pas Bureau ou Documents comme emplacement d’enregistrement par défaut ou dossier d’import par défaut. Comment décider quoi mettre où est résumé dans « Comment choisir où une application Windows stocke ses données locales ».
  • Décidez le comportement lorsque l’utilisateur choisit un emplacement sous OneDrive. Pour une application qui laisse l’utilisateur choisir un emplacement d’enregistrement, incluez à l’avance dans la spécification une décision de conception telle qu’avertir lorsque le chemin choisi est sous OneDrive (sous le chemin des variables d’environnement OneDrive / OneDriveCommercial), ou refuser seulement le placement d’un fichier de verrou ou d’une base de données.

7. Réponse côté informatique — contrôler avec des épingles et une stratégie

Depuis la position informatique, l’exploitation réaliste n’est pas « désactiver entièrement les Fichiers à la demande » mais garantir le contenu réel seulement là où le métier en a besoin.

  • Épinglez les dossiers qu’une application métier lit. Choisissez « Toujours conserver sur cet appareil » dans le menu contextuel de l’Explorateur, ou exécutez attrib +p -u <folder> /s /d depuis un script d’image (vous spécifiez -u en même temps afin qu’un mélange de fichiers déjà en ligne uniquement soit basculé de façon fiable vers épinglé). Un fichier épinglé a son contenu réel garanti localement et est aussi hors de la conversion automatique en ligne uniquement discutée plus loin.72
  • Configurez le KFM et les Fichiers à la demande « exprès », pas « c’était activé quand on l’a remarqué ». Les principales stratégies (stratégie de groupe / Intune) sont les suivantes.111
Objectif Stratégie (valeur de registre) Effet
Contrôle des Fichiers à la demande Use OneDrive Files On-Demand (FilesOnDemandEnabled) Activé : les nouveaux utilisateurs sont par défaut en ligne uniquement. Désactivé : synchronisation complète classique
Application en masse du KFM Silently move Windows known folders to OneDrive (KFMSilentOptIn) Déplacer Bureau et analogues sans action de l’utilisateur
Interdire le KFM Prevent users from moving their Windows known folders to OneDrive (KFMBlockOptIn) Interdire le déplacement des dossiers connus
Interdire de désactiver le KFM Prevent users from redirecting their Windows known folders to their PC (KFMBlockOptOut) Interdire à l’utilisateur de le désactiver
Réduire la capacité des sites d’équipe Convert synced team site files to online-only (DehydrateSyncedTeamSites) Rendre les sites d’équipe synchronisés en ligne uniquement (noter que cela agit dans le sens de la disparition du contenu réel)
  • Sachez comment le Contrôle d’espace de stockage se déplace. Le Contrôle d’espace de stockage a une fonction qui renvoie automatiquement en ligne uniquement les fichiers cloud qui n’ont pas été ouverts depuis un certain nombre de jours, et vous pouvez configurer le nombre de jours avec la stratégie (ConfigStorageSenseCloudContentDehydrationThreshold). La valeur par défaut est 0 (ne pas renvoyer automatiquement), mais si un utilisateur l’a activé depuis l’écran des paramètres, ou si l’organisation l’a configuré pour des appareils à faible capacité, « un fichier ouvert la semaine dernière est revenu à une icône nuage » se produit comme comportement normal. Un fichier épinglé est hors périmètre, donc « épingler les dossiers métier » fonctionne ici aussi.122
Branches de la conversion automatique en ligne uniquement du Contrôle d'espace de stockageDans la libération automatique du Contrôle d'espace de stockage, un fichier épinglé est hors périmètre et le contenu réel est conservé ; un fichier non épinglé qui n'a pas été ouvert depuis un certain nombre de jours est renvoyé en ligne uniquementOuiNonOuiNonLibération automatique du Contrôle d'espace de stockageÉpinglé ?Hors périmètre ; le contenu réel est conservéPas ouvert depuis un certain nombre de jours ?Renvoyé en ligne uniquementLe contenu réel est conservéLa valeur par défaut 0 ne renvoie pas automatiquement

Figure 17 : Le Contrôle d’espace de stockage renvoie en ligne uniquement un fichier qui n’a pas été ouvert depuis un certain nombre de jours, mais une épingle est hors périmètre.

  • Estimez l’impact avant de désactiver les Fichiers à la demande. Désactiver FilesOnDemandEnabled devient une synchronisation classique en téléchargement complet, mais la consommation disque et la charge de bande passante de la première synchronisation bondissent. Microsoft recommande de le laisser activé, et vous devriez traiter la désactivation comme une mesure limitée après avoir confirmé que « le volume de données des utilisateurs cibles est petit » et « il y a de la marge disque ».112
  • Intégrez-le dans la procédure de support. Mettre la procédure de triage du chapitre suivant dans le modèle de demande « un fichier sur le Bureau ne s’ouvre pas » maintient la qualité de la réponse même lorsque la personne qui s’en occupe change.

8. Procédure de triage — lorsque l’on vous dit « le fichier ne s’ouvre pas »

Lorsque vous prenez la consultation, confirmez de haut en bas.

# Quoi confirmer Comment Ce que vous apprenez
1 Le chemin est-il sous OneDrive ? Confirmez la racine de sync avec echo %OneDrive% et faites-la correspondre au chemin cible. Confirmez aussi le vrai chemin de « Bureau » dans la barre d’adresse de l’Explorateur Si le KFM / OneDrive est impliqué
2 L’état du fichier Confirmez U (en ligne uniquement), P (épinglé) et O avec attrib <path>. Regardez aussi « Taille sur le disque » dans les propriétés Si le contenu réel est local, ou si c’est un espace réservé
3 Si OneDrive tourne L’icône de la barre des tâches (connecté, en pause, erreur), Get-Process OneDrive Si l’hydratation est possible. 0x8007016A est typiquement arrêté ou mal configuré8
4 Le réseau Proxy d’entreprise, bande passante, accessibilité au service OneDrive Si le téléchargement lui-même est possible
5 L’espace disque libre Espace libre sur le volume cible. À faible capacité il y a aussi une stratégie par laquelle OneDrive bloque les téléchargements Un autre facteur d’échec d’hydratation
6 Un enregistrement de l’échec Notez le code d’erreur de l’application et l’heure d’occurrence, et faites-les correspondre à l’affichage d’erreur de l’application de sync Si c’est un problème côté application ou côté OneDrive

Le palliatif est de faire un clic droit sur le dossier cible et de choisir « Toujours conserver sur cet appareil » (ou attrib +p /s /d). Cela aligne le contenu réel en local et le métier peut reprendre. Par-dessus, décidez si la cause essentielle est côté application (chapitre 6) ou côté informatique (chapitre 7) comme réponse permanente.

Le chemin d'un palliatif à une réponse permanenteEn palliatif, définir le dossier cible sur Toujours conserver sur cet appareil aligne le contenu réel en local pour que le métier puisse reprendre ; par-dessus vous décidez si la cause essentielle est côté application ou côté informatique et passez à une réponse permanenteCôté applicationCôté informatiqueÉpingler en palliatifLe contenu réel est aligné en localLe métier reprendOù est la cause essentielle ?Vers la réponse du chapitre 6Vers la réponse du chapitre 7

Figure 18 : Le palliatif est d’épingler, d’aligner le contenu réel et de reprendre le métier ; la réponse permanente se poursuit après avoir décidé s’il s’agit du côté application ou du côté informatique.

Si vous avez confirmé jusqu’ici et que « le chemin n’est pas sous OneDrive » et « ce n’est pas un espace réservé non plus », vous passez à d’autres causes classiques telles qu’un dossier partagé ou la longueur de chemin. « Les pièges des lecteurs réseau et des chemins UNC » et « MAX_PATH et les pièges des chemins et noms de fichiers Windows » sont la carte pour la suite.

9. Résumé

  • Le KFM peut avoir déplacé le vrai Bureau, Documents et Images sous C:\Users\<nom>\OneDrive\. Une application qui suppose un chemin fixe casse ici. Résoudre avec les API de dossiers connus est le premier pas.
  • Les Fichiers à la demande sont activés par défaut, et des espaces réservés sans contenu local existent comme une évidence. Un espace réservé est un point d’analyse de l’API Cloud Files (cldflt.sys), et l’ouvrir l’hydrate automatiquement.
  • L’état se juge d’après les attributs de fichier (OFFLINE / RECALL_ON_DATA_ACCESS / PINNED / UNPINNED) et apparaît comme O, P et U dans attrib. Contrôler les attributs seuls ne provoque pas de téléchargement.
  • Les accidents d’application métier apparaissent comme échec d’hydratation hors ligne, téléchargement complet depuis un lot, code qui n’attend pas les attributs, interaction entre FileSystemWatcher et la synchronisation, conflit entre un verrou exclusif et la synchronisation, et hydratation induite par un produit de sécurité.
  • Côté application, les bases sont « juger d’après les attributs et ne pas ouvrir à la légère », « ne pas placer le dossier de données sous OneDrive », et « dire que c’est sous OneDrive lorsque vous signalez une erreur ».
  • Côté informatique, vous créez l’état voulu avec « l’épinglage des dossiers métier » et « le contrôle par stratégie du KFM, des Fichiers à la demande et du Contrôle d’espace de stockage ».
  • Le triage peut se parcourir mécaniquement dans l’ordre chemin → attrib → OneDrive en cours → réseau → espace libre → enregistrement.

La prochaine fois que l’on vous dit « le fichier est là mais il ne s’ouvre pas », posez d’abord ceci.

Ce fichier est-il vraiment sur le disque local ? Ou n’est-ce que l’apparence du cloud qui est assise là ?

Articles connexes

Domaines de conseil associés

KomuraSoft LLC prend en charge l’investigation des pannes d’applications métier impliquant OneDrive et le stockage cloud — « un import qui fonctionnait ne fonctionne plus après un remplacement de PC », « un fichier ne s’ouvre que sur un PC particulier » —, la conception et la remédiation du traitement de fichiers et de la surveillance qui supposent des espaces réservés, et les revues de conception d’emplacement d’enregistrement dans un environnement KFM / Fichiers à la demande. Commencer par isoler le symptôme convient — n’hésitez pas à nous contacter.

Références

  1. Microsoft Learn, Redirect and move Windows known folders to OneDrive. Que le KFM déplace Bureau, Documents et Images sous OneDrive, et les stratégies d’invite, d’application silencieuse, d’interdiction de désactivation et d’interdiction de déplacement.  2 3 4

  2. Microsoft Learn, Recommended sync app configuration. Que les Fichiers à la demande sont activés par défaut et que les laisser activés est recommandé, et que le Contrôle d’espace de stockage nettoie les « fichiers disponibles localement qui ne sont pas épinglés ».  2 3 4 5

  3. Microsoft Support, Save disk space with OneDrive Files On-Demand for Windows. Les trois états des Fichiers à la demande et les actions « Toujours conserver sur cet appareil » et « Libérer de l’espace ».  2 3

  4. Microsoft Learn, Build a Cloud Sync Engine that Supports Placeholder Files. Un aperçu de l’API Cloud Files, qu’un espace réservé ne tient qu’environ 1 Ko de métadonnées et que l’ouvrir l’hydrate automatiquement, que le point d’analyse est caché aux processus autres que le moteur de synchronisation et ceux sous %systemroot%, et le toast et le blocage pour l’hydratation en arrière-plan.  2 3 4 5 6

  5. Microsoft Learn, File Attribute Constants. Les définitions et valeurs de FILE_ATTRIBUTE_OFFLINE, RECALL_ON_OPEN, RECALL_ON_DATA_ACCESS, PINNED et UNPINNED.  2

  6. Microsoft Learn, attrib. La syntaxe de la commande attrib et les indicateurs d’attribut y compris O (hors ligne), P (épinglé) et U (désépinglé).  2

  7. Microsoft Learn, Query and set Files On-Demand states in Windows. Confirmer l’état des Fichiers à la demande avec attrib et le définir avec +p, -p et +u, et le service CldFlt.  2 3 4 5

  8. Microsoft Learn, Error 0x8007016a when copying files in OneDrive. Que l’erreur 0x8007016A “The cloud file provider is not running” se produit lorsque OneDrive est mal configuré ou arrêté, et les étapes de résolution.  2 3

  9. Microsoft Learn, CreateFileW function (fileapi.h). Que FILE_FLAG_OPEN_NO_RECALL est un indicateur indiquant que « les données demandées doivent être laissées côté distant et non transférées vers le stockage local » (il n’empêche pas d’obtenir les données elles-mêmes), et l’obtention d’attributs en ouvrant avec des droits d’accès 0.  2

  10. Microsoft Learn, Handling placeholders. Qu’un espace réservé doit avoir FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS, et qu’une lecture ou une écriture négligente vers un fichier avec cet attribut invite une hydratation inutile ou une corruption de données.  2

  11. Microsoft Learn, IT Admins - Use OneDrive policies to control sync settings. Les stratégies pour configurer l’application de synchronisation OneDrive avec GPO/Intune, y compris FilesOnDemandEnabled, KFMSilentOptIn, KFMBlockOptIn, KFMBlockOptOut et DehydrateSyncedTeamSites.  2 3 4

  12. Microsoft Learn, Policy CSP - Storage. Que le Contrôle d’espace de stockage peut rendre en ligne uniquement les fichiers cloud qui n’ont pas été ouverts depuis un certain nombre de jours, la valeur par défaut 0 (ne pas renvoyer automatiquement), et la configuration de 0–365 jours.  2 3

  13. Microsoft Support, What do the OneDrive icons mean?. La signification des icônes d’état affichées dans l’Explorateur, telles que le nuage et les coches. 

  14. Microsoft Learn, Plan for an Azure File Sync deployment. Qu’une analyse antivirus peut provoquer le rappel d’un fichier avec l’attribut RECALL_ON_DATA_ACCESS, et que Microsoft Defender et des produits analogues sautent les fichiers avec cet attribut au moment de l’analyse à la demande. 

Articles récents partageant les mêmes étiquettes, pour approfondir des sujets proches.

Ces pages replacent le sujet dans un contexte plus large de services et de décisions.

Cet article est directement lié aux services suivants.

Questions fréquentes

Questions souvent posées lors d’une consultation sur le sujet de cet article.

Une application métier dit « fichier introuvable » et ne peut pas lire un CSV posé sur le Bureau. Pourquoi ?
Dans bien des cas, le dossier Bureau lui-même a été déplacé sous C:\Users\<nom d'utilisateur>\OneDrive\Desktop par le Known Folder Move (KFM) de OneDrive, ou le fichier est devenu un espace réservé en ligne uniquement. Une application qui suppose un chemin fixe tel que C:\Users\<nom d'utilisateur>\Desktop ne retrouve plus le fichier après le déplacement. Même si le chemin est correct, un fichier en ligne uniquement peut échouer à s'ouvrir lorsque OneDrive est arrêté ou que le réseau est en mauvais état. Vérifiez d'abord si le chemin cible est sous OneDrive, et contrôlez avec la commande attrib si U (en ligne uniquement) est posé. En palliatif, vous pouvez sécuriser le contenu réel en local avec « Toujours conserver sur cet appareil » dans le menu contextuel.
Un programme peut-il dire si un fichier est en ligne uniquement ?
Oui. Un espace réservé en ligne uniquement porte des attributs tels que FILE_ATTRIBUTE_OFFLINE et FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS (0x00400000), de sorte que vous pouvez juger l'état d'après les attributs du fichier sans télécharger le contenu. Obtenir les attributs ou énumérer un dossier ne provoque pas d'hydratation (téléchargement). En .NET, certaines valeurs ne sont pas définies sur FileAttributes : on convertit en entier et on teste par opérations bit à bit. Si vous devez vraiment ouvrir sans lire le contenu, un moyen tel que FILE_FLAG_OPEN_NO_RECALL de CreateFile est aussi disponible.
Désactiver les Fichiers à la demande résout-il le problème ?
Traitez la désactivation comme un dernier recours. La désactiver télécharge localement tous les fichiers du périmètre de synchronisation, si bien que la capacité disque et la charge réseau de la première synchronisation deviennent importantes, et Microsoft recommande aussi de la laisser activée. En pratique, il est plus souple de n'appliquer « Toujours conserver sur cet appareil » (épingler) qu'aux dossiers qu'une application métier lit. Plus fondamentalement, la correction fiable consiste à concevoir pour que le dossier de données et le dossier d'import de l'application ne soient pas sous la gestion de OneDrive.
J'ai défini « Toujours conserver sur cet appareil », mais certains fichiers finissent par revenir à une icône nuage. Pourquoi ?
Vérifiez d'abord avec la commande attrib que le fichier a vraiment l'épingle (attribut P). Un fichier épinglé est hors de la conversion automatique en ligne uniquement du Contrôle d'espace de stockage, mais un fichier seulement « disponible localement » parce que quelqu'un l'a ouvert, sans épingle, peut être renvoyé en ligne uniquement après un délai selon les paramètres et la stratégie du Contrôle d'espace de stockage. L'action « Libérer de l'espace » de l'utilisateur, et une stratégie qui rend les fichiers de sites d'équipe en ligne uniquement (DehydrateSyncedTeamSites), ramènent aussi l'icône nuage. Pour les dossiers qui doivent rester locaux pour le métier, opérez en épinglant à l'échelle du dossier.

Profil de l’auteur

Page de présentation de l’auteur de l’article.

Go Komura

Représentant de KomuraSoft LLC

Spécialisé dans le développement de logiciels Windows, le conseil technique et l’analyse de pannes, notamment pour les systèmes existants et les incidents difficiles à reproduire.

Retour au blog