Lorsque vous collez un fichier “sur” un autre fichier du même nom, existe-t-il un bref instant pendant lequel aucun fichier n'existe?

5

Cela m'inquiétait à chaque fois que je remplaçais des fichiers HTML statiques dans un environnement d'hébergement Web partagé.

Lorsque vous collez (ou mettez en FTP) un fichier "sur" un autre fichier portant le même nom, existe-t-il un bref instant pendant lequel aucun fichier n'existe?

Si j'ai index.htmlun serveur Web et que j'en colle un nouveau index.html, les utilisateurs qui demandent ce fichier risquent-ils de recevoir une 404erreur?

Fermeture Cowboy
la source

Réponses:

3

Cela dépend vraiment de deux choses: la manière dont le fichier est remplacé et le système d'exploitation sous-jacent au serveur WWW. Voici trois exemples montrant comment cela fait une différence:

  • Un système d'exploitation conforme à POSIX qui utilise mvpour mettre à jour le fichier à partir d'un fichier temporaire préparé à l'avance: mv est garanti d'appeler (ou de se comporter comme) rename(), ce qui à son tour, conformément à la spécification POSIX, garantit à tout moment le nom du fichier cible, dans ce cas index.html, référencera toujours un fichier, qu’il s’agisse du fichier original ou du nouveau fichier. Et le contenu du fichier ne sera jamais dans un état partiellement écrit.

    Il en va de même pour un serveur FTP / HTTP qui télécharge dans un fichier temporaire et qui appelle ensuite rename(), lorsque le fichier temporaire est complètement téléchargé, pour déplacer le fichier temporaire vers la destination spécifiée.

  • Microsoft Windows utilisant une MOVEcommande quelconque pour mettre à jour le fichier, un fichier temporaire pré-préparé: L'implémentation habituelle d'une MOVEcommande (comme on peut le voir ici dans le source de la MOVEcommande ReactOS ) consiste à appeler MoveFileEx()avec l' MOVEFILE_REPLACE_EXISTINGindicateur activé. Ceci, du moins sous Windows NT (car l’indicateur est transmis aux pilotes de système de fichiers nécessaires à la prise en charge des renommements atomiques), garantit qu’un fichier nommé index.htmlexistera toujours, comme avec POSIX et rename().

    Il en va de même pour un serveur FTP / HTTP qui télécharge dans un fichier temporaire et qui appelle ensuite MoveFileEx(), lorsque le fichier temporaire est complètement téléchargé, pour déplacer le fichier temporaire vers la destination spécifiée.

  • Microsoft Windows utilisant une COPYcommande quelconque pour mettre à jour le fichier à partir d'un fichier temporaire pré-préparé: La COPYcommande ne pas utiliser MoveFileEx(). Au lieu de cela, il ouvre le fichier existant, le tronquant à une longueur nulle et le réécrit à la place (à nouveau, voir CopyFileEx()dans ReactOS ). Bien qu'il n'y ait jamais un point où le nom index.htmlne pointe pas vers un fichier, le fichier auquel il fait référence sera dans un état partiellement écrit pendant le processus de copie et il est possible que le serveur WWW serve des versions tronquées. de ce fichier en conséquence.

    Il en va de même pour un serveur FTP / HTTP qui (a) télécharge simplement les fichiers sur place, en tronquant et en écrasant les originaux, ou (b) télécharge dans un fichier temporaire, puis copie le fichier temporaire dans la destination spécifiée.

En bref: si vous téléchargez via un serveur FTP / HTTP, cela dépend de la manière dont votre serveur FTP / HTTP fonctionne en interne. Si vous modifiez directement la zone de stockage de fichiers du serveur WWW, cela dépend des outils que vous utilisez pour le faire.

JdeBP
la source
1

Le fichier sera toujours là, mais s’ils le demandent au mauvais moment, il se peut qu’il soit dans un état intermédiaire (vide ou tronqué).

Si le programme qui gère le téléchargement de fichier est suffisamment intelligent, il peut télécharger sous un nouveau nom puis remplacer l'ancien fichier. Si c'est le cas, il y aura effectivement un intervalle très bref où le nom index.htmln'existe pas mais où le nom de fichier temporaire ou une sauvegarde de la version précédente du fichier existe. (Le premier peut être dans un répertoire temporaire et donc invisible de l'extérieur.)

geekosaur
la source