Pourquoi ne puis-je pas modifier le nom d'un fichier en cours de lecture sous Windows comme je peux le faire sous Linux / Mac?

23

Une des choses qui me laisse perplexe depuis que je commence à utiliser Linux est le fait qu’elle vous permet de changer le nom d’un fichier, voire de le supprimer en cours de lecture. Un exemple est la façon dont j'ai accidentellement essayé de supprimer une vidéo en cours de lecture. J'ai réussi et j'ai été surpris d'apprendre que vous pouvez modifier à peu près n'importe quoi dans un fichier sans vous soucier de son utilisation actuelle ou non.

the_midget_17
la source
2
Renommer un fichier verrouillé n'est pas un problème sous Windows. La suppression est généralement, il y a peu de programmes qui ouvrent un fichier avec l'option FILE_SHARE_DELETE activée.
Hans Passant
En fait, vous ne l'avez pas supprimé, vous l'avez simplement dissocié du répertoire dans lequel il se trouvait. Le fichier existe toujours, il se peut qu'il n'ait aucun nom dans le système de fichiers. (Bien qu'il ait toujours un nom dans le /procsystème de fichiers via le programme qui l'a ouvert.) Un fichier ne peut être vraiment supprimé que s'il ne contient plus de références, et cela se fait automatiquement.
David Schwartz

Réponses:

36

Chaque fois que vous ouvrez ou exécutez un fichier dans Windows, Windows verrouille le fichier (il s'agit d'une simplification, mais généralement de la valeur true.) Un fichier verrouillé par un processus ne peut pas être supprimé tant que ce processus ne l'a pas libéré. C’est pourquoi chaque fois que Windows doit se mettre à jour, vous devez redémarrer pour que celle-ci prenne effet.

D'autre part, les systèmes d'exploitation de type Unix tels que Linux et Mac OS X ne verrouillent pas le fichier, mais plutôt les secteurs de disque sous-jacents. Cela peut sembler une différenciation triviale, mais cela signifie que l'enregistrement du fichier dans la table des matières du système de fichiers peut être supprimé sans perturber tout programme ayant déjà ouvert le fichier. Vous pouvez donc supprimer un fichier en cours d’exécution ou en cours d’exécution et continuer à exister sur le disque aussi longtemps que le processus aura un descripteur ouvert, même si son entrée dans la table des fichiers a disparu.

Andrew Lambert
la source
2
Merci pour cette réponse. Cela explique beaucoup plus la différence. Cela permet également d'expliquer pourquoi le chargement de fichiers / vidéos volumineux ne nécessite pas une énorme quantité de RAM. Sinon, la lecture d'une vidéo de grande taille risquerait d'encrasser tout votre système.
Jerry Saravia
4
Si vous supprimez un fichier en cours d'utilisation et que vous souhaitez le récupérer sous Linux, vous pouvez trouver l'entrée du fichier dans / proc, comme décrit dans cette question .
Ken Bloom
2
C'est une sorte de généralisation - toutes les mises à jour Windows de nos jours (sous Windows 7) ne nécessitent pas un redémarrage, et j'en ai fait beaucoup sous Linux.
Alan B
10

Windows utilise par défaut le verrouillage de fichier automatique et obligatoire. UNIXes est paramétré par défaut sur un verrouillage manuel coopératif des fichiers. Dans les deux cas, les valeurs par défaut peuvent être remplacées, mais dans les deux cas, elles ne le sont généralement pas.

Beaucoup de vieux codes Windows utilisent l'API C / C ++ (fonctions comme fopen) plutôt que l'API native (fonctions comme CreateFile). L'API C / C ++ ne vous permet pas d'indiquer comment le verrouillage obligatoire fonctionnera. Vous obtenez donc les valeurs par défaut. Le "mode de partage" par défaut tend à interdire les opérations "conflictuelles". Si vous ouvrez un fichier en écriture, les écritures sont supposées entrer en conflit, même si vous n'écrivez jamais dans le fichier. Idem pour renommer.

Et voici où ça empire. À l'exception de l'ouverture en lecture ou en écriture, l'API C / C ++ ne fournit aucun moyen de spécifier ce que vous avez l'intention de faire avec le fichier. L’API doit donc supposer que vous allez effectuer toute opération légale. Étant donné que le verrouillage est obligatoire, une openautorisation autorisant une opération en conflit sera refusée, même si le code n'a jamais eu l'intention d'exécuter l'opération en conflit, mais consistait simplement à ouvrir le fichier à une autre fin.

Ainsi, si le code utilise l'API C / C ++, ou utilise l'API native sans réfléchir spécifiquement à ces problèmes, ils empêcheront le plus grand nombre possible d'opérations possibles pour chaque fichier ouvert et ne pourront pas l'ouvrir, à moins que toutes les opérations possibles ne soient effectuées. pourrait jouer dessus une fois ouvert est sans conflit.

À mon avis, la méthode Windows fonctionnerait beaucoup mieux que la méthode UNIX si chaque programme choisissait ses modes de partage et ses modes ouverts de manière judicieuse et en toute sécurité. La méthode UNIX, cependant, fonctionne mieux si le code ne se donne pas la peine de réfléchir à ces problèmes. Malheureusement, l'API C / C ++ de base ne correspond pas bien à l'API de fichier Windows d'une manière qui gère les modes de partage et les conflits s'ouvrent bien. Donc, le résultat net est un peu brouillon.

David Schwartz
la source
0

C'est une question très intéressante qui m'a fait penser à une réponse viable. J'espère que d'autres pourront fournir une sauvegarde ici.

J'utilise Windows et Linux et l'ai aussi remarqué. Je suis aussi un utilisateur de vim. Vim lira un fichier texte dans une "mémoire tampon" ou dans la RAM, puis ne touchera pas le fichier avant l'enregistrement. Linux pourrait effectuer ce genre d’action en général avec tous les fichiers.

Prenez votre vidéo par exemple, elle la lit, si possible dans sa totalité, dans la RAM, puis vous avez une copie de la vidéo qui est facilement accessible, consultable et accessible. Si le fichier est trop volumineux, vous pouvez rencontrer des problèmes car Linux peut ne pas lire la vidéo en entier, peut-être simplement un gros morceau. Lorsque votre lecteur arrive à la fin de la vidéo en mémoire tampon, il essaiera de relire le fichier. Si vous avez supprimé la vidéo, ça craint pour vous.

Windows est un système d'exploitation beaucoup plus sûr dans certains cas, car il vous empêche de le faire. Cela peut mettre les fichiers en mémoire tampon de la même manière que Linux, mais ajoute également le verrouillage de fichier pour vous empêcher, ou d'autres programmes, de modifier les fichiers sur lesquels vous travaillez ou que vous visualisez. Cela aide à garder le fichier intact et vous empêche, à vous ou à d’autres programmes, d’écraser les modifications apportées.

Jerry Saravia
la source
Vous ne pouvez pas réellement le supprimer . Il suffit de le déplacer et de le renommer.
Daniel Beck
2
Vous pouvez le "rm". C'est assez proche pour le supprimer.
Chris Moore