Pourquoi ce fichier n'existe-t-il apparemment pas lorsque vous essayez de le supprimer?

9

Il y a environ un mois, j'ai décompressé la source Linux dans un dossier de Cygwin (j'étais curieux de savoir si cela se compilerait avec MinGW car mon autre ordinateur exécutant Linux est un Sempron monocœur lent). J'ai essayé de le supprimer, mais il reste 1 fichier et il ne sera pas supprimé ...

Cygwin réside C:\cygwinet j'ai extrait la source C:\cygwin\src\linux-3.7.1. Il n'a pas compilé ... J'ai donc essayé de supprimer le dossier. Ça allait bien, jusqu'à la fin, quand j'ai réalisé que tous les fichiers n'étaient pas supprimés. J'ai essayé de supprimer à linux-3.7.1nouveau le dossier et une erreur est apparue:

Objet non-trouvé

J'ai ouvert le dossier et j'ai découvert qu'il restait 1 fichier source:, aux.cqui se trouve dans C:\cygwin\src\linux-3.7.1\drivers\gpu\drm\nouveau\core\subdev\i2c\aux.c.

Ça ne sera pas:

  • Supprimer
  • Ouvert
  • Bouge toi

Les propriétés générales:

Général

Propriétés de sécurité:

Sécurité

Comment supprimer ce fichier?

Alex
la source
D'accord, en cours d'exécution pour le moment
Alex
Fait, mais ça n'a pas marché ...
Alex
1
Ne devrait pas fonctionner. L'incapacité de le supprimer de l'intérieur de DOS / windows est comme prévu. Ce n'est donc pas une erreur que vous pouvez corriger de cette façon.
Hennes

Réponses:

14

Essayez ceci à partir d'une invite de commande (élevée):

del \\?\C:\cygwin\src\linux-3.7.1\drivers\gpu\drm\nouveau\core\subdev\i2c\aux.c
Karan
la source
Ok aux.cest supprimé, mais maintenant le dossier `src` est apparemment utilisé lorsque j'essaye de le supprimer
Alex
Rien de caché dedans? Peut rd /s /q \\?\C:\cygwin\src- être vous aidera.
Karan
Imprime la sortie que `src` est en cours d'utilisation
Alex
2
Karan: Oh, intelligent. Éviter l'espace de noms du système de fichiers normal. @Alex Yan: Aucune fenêtre cmd ouverte dans le dossier?
Hennes
Ouais, rd devrait faire l'affaire à moins que quelque chose ne s'empare du dossier ou d'un fichier à l'intérieur ... Fermez toutes les autres fenêtres / applications ouvertes et vérifiez les propriétés de src. Quelle est la taille et le nombre de fichiers à l'intérieur indiqués?
Karan
13

Le problème que vous avez rencontré est dû aux anciennes réservations DOS.

Les fichiers de la liste ci-dessous ont une signification particulière. Une partie de cela est toujours présente dans les versions Windows modernes:

CON, PRN, AUX , CLOCK $, NUL, COM1, COM2, COM3, COM4, ​​COM5, COM6, COM7, COM8, COM9 LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 et LPT9.

Le moyen le plus simple de les supprimer est de démarrer un système d'exploitation qui ne traite pas ces noms de fichiers comme spéciaux. (par exemple, démarrez n'importe quel liveCD non Windows).

[modifier] Tests effectués sur win7-x86 ultime:

Création d'un fichier de test simple:

S: \> copier con foo.c
tester
^ Z
        1 fichier (s) copié (s).

Vérification du contenu:

S: \> tapez foo.c
tester

Maintenant avec aux .c

S: \> copier con aux.c
^ Z
Le système ne peut pas trouver le fichier spécifié.
        0 fichier (s) copié (s).

Il semble que certaines parties des fenêtres soient toujours rétrocompatibles.

Hennes
la source
Mais ce fichier estaux.c
Alex
3
Il commence toujours par aux et l'ancien style de nom de fichier est «Extension de point de nom de fichier». Et je viens de tester copy con aux.csur win7 et ça a échoué. ( copy con test.cfonctionne).
Hennes
7

Dans ce cas, il s'agissait évidemment de la signification particulière de l' auxhéritage de l'époque DOS , comme Hennes l'a souligné correctement. Cependant, pour les lecteurs trébuchant à ce sujet à l'avenir, je voudrais ajouter un autre cas possible où ce comportement peut être vu.

C'est à ce moment qu'un fichier a été créé avec un point de fin. Il existe également des cas plus exotiques. Mais filename.ext.serait un tel nom de fichier et ne pourrait normalement pas être supprimé du sous-système Win32. C'est là que l'astuce de Karan entre en jeu. Il utilise un nom qui avant d'être passé à la couche sous le sous-système Win32 sera changé de sa \\?\C:\...forme en "natif" (c'est aussi ainsi que les pilotes de filtrage du système de fichiers le voient) forme \??\C:\.... Alors que, selon la version de Windows, il peut s'agir d'un soi-disant répertoire d'objets (utilisez WinObj de Sysinternals / Microsoft pour jeter un œil dans l'espace de noms du gestionnaire d'objets) ou d'un lien symbolique (à ne pas confondre avec l'entité de même nom dans NTFS depuis Vista). vers un autre répertoire d'objets tel que\DosDevices. Ce dernier n'est qu'un nom et décrit la partie de l'espace de noms du gestionnaire d'objets visible par défaut par les processus Win32. Pour plus de détails, consultez la série de livres Windows Internals ou lisez plus sur l'analyse de chemins, en particulier sur Project Zero de Google (The Definitive Guide on Win32 to NT Path Conversion) . En particulier, vous souhaiterez peut-être faire attention à la différence entre les espaces de noms de fichiers Win32 et les espaces de noms de périphériques Win32 .

Maintenant, comment un tel fichier peut-il être créé en premier lieu? Il existe plusieurs possibilités.

  1. un programme Win32 qui utilise le \\?\X:préfixe pour les noms de chemin afin d'étendre la longueur de chemin disponible de 260 caractères à environ 32767 caractères (voir référence 1!) a créé le fichier en premier lieu, évitant ainsi certaines limitations du sous-système Win32.
  2. un programme enraciné dans un sous-système différent. L'ancien sous-système POSIX (plus tard Interix maintenant SUA), le sous-système OS / 2 (disparu depuis longtemps, mais qui existait auparavant sur NT 3.51) ou une couche qui n'est pas exactement un sous-système au sens de Windows (Cygwin, à ma connaissance) créé le fichier ou le dossier. De même, WSL (Windows Subsystem for Linux) sur Windows 10 est maintenant un autre candidat.
  3. un système d'exploitation différent l'a créé (démarrage Linux parallèle, par exemple).
  4. c'est un fichier sur un partage réseau situé sur un serveur non Windows.

Les deux derniers points font également allusion à l'un des remèdes mentionnés: démarrer un CD live non Windows et supprimer le ou les fichiers.

Le problème peut en fait être comparé au cas où un ancien programme Win32 non Unicode est confronté à des noms de fichiers provenant de plusieurs pages de codes. Souvent, il ne sera pas en mesure de "trouver" certains d'entre eux, car chaque page de code ANSI respective ne peut contenir que 256 caractères, tandis que UTF-16 (pas son sous-ensemble UCS-2, cependant) peut théoriquement coder une quantité pratiquement illimitée de points de code (lire le sujet sur unicode.org et Wikipedia ).

J'espère que cela vous aidera à mieux comprendre les problèmes sous-jacents. Je ne voulais pas modifier cette longue réponse dans l'une des autres réponses, bien qu'elle ne fasse que les compléter. Les autres réponses sont parfaitement valables sans celle-ci.


Note de bas de page 1: le nombre maximal de caractères dans le chemin n'est pas absolu car un chemin proche du maximum absolu (32 767 caractères) peut très bien être développé par le gestionnaire d'objets et les filtres du système de fichiers ou les systèmes de fichiers eux-mêmes (par exemple, les points d'analyse) .

0xC0000022L
la source
J'adore le bagage technique ajouté.
Hennes
0

J'ai eu ce problème et j'étais très frustré, rien n'a fonctionné. Ensuite, j'ai utilisé un CD Linux Ubuntu. Démarré à partir du CD-ROM, est passé en mode démo, a accédé à l'emplacement des fichiers problématiques et les a simplement supprimés. Cela fonctionne comme un rêve.

chris frisch
la source
1
Sachez que la raison pour laquelle Windows ne peut pas supprimer un fichier peut être le fait que des caractères non autorisés dans Windows ont été placés dans le nom de fichier sous Linux. Je suis sûr que ce n'est pas parce que Linux s'en fiche. J'ai demandé aux modérateurs d'approuver la suppression d'une partie du texte et de conserver la partie utilisable.
Mogget