Mengapa file ini tampaknya tidak ada ketika mencoba menghapusnya?

9

Sebulan yang lalu, saya menghapus sumber Linux di folder di Cygwin (saya ingin tahu apakah itu akan dikompilasi dengan MinGW karena komputer saya yang lain menjalankan Linux adalah Sempron single core lambat). Saya mencoba menghapusnya, tetapi masih ada 1 file lagi, dan itu tidak akan dihapus ...

Cygwin tinggal di C:\cygwin, dan saya untar sumbernya C:\cygwin\src\linux-3.7.1. Itu tidak mengkompilasi ... Jadi saya mencoba menghapus folder. Itu berjalan dengan baik, sampai pada akhirnya, ketika saya menyadari tidak semua file dihapus. Saya mencoba menghapus linux-3.7.1folder lagi, dan muncul kesalahan:

Barang tidak ditemukan

Saya membuka folder, dan menemukan bahwa ada 1 file sumber yang tersisa:, aux.cyang ada di C:\cygwin\src\linux-3.7.1\drivers\gpu\drm\nouveau\core\subdev\i2c\aux.c.

Tidak akan:

  • Menghapus
  • Buka
  • Pindah

Properti Umum:

Umum

Properti keamanan:

Keamanan

Bagaimana cara menghapus file ini?

Alex
sumber
Baiklah, jalankan saat ini
Alex
Selesai, tidak berhasil ...
Alex
1
Seharusnya tidak bekerja. Ketidakmampuan untuk menghapusnya dari dalam DOS / windows seperti yang dirancang. Jadi ini bukan kesalahan yang bisa Anda perbaiki dengan cara ini.
Hennes

Jawaban:

14

Coba ini dari prompt perintah (tinggi):

del \\?\C:\cygwin\src\linux-3.7.1\drivers\gpu\drm\nouveau\core\subdev\i2c\aux.c
Karan
sumber
Ok aux.csudah dihapus, tapi sekarang folder `src` tampaknya sedang digunakan ketika saya mencoba untuk menghapusnya
Alex
Tidak ada yang disembunyikan di dalamnya? Mungkin rd /s /q \\?\C:\cygwin\srcakan membantu.
Karan
Mencetak output yang sedang digunakan `src`
Alex
2
Karan: Oh, pintar. Menghindari namespace sistem file normal. @Alex Yan: Tidak ada jendela cmd yang terbuka di folder?
Hennes
Ya, rd harus melakukan trik kecuali ada yang meraih folder, atau file di dalamnya ... Tutup semua jendela / aplikasi lain yang terbuka, dan periksa Properti src. Berapa ukuran dan jumlah file di dalam yang ditampilkan?
Karan
13

Masalah yang Anda hadapi adalah karena reservasi DOS kuno.

File dalam daftar di bawah ini memiliki arti khusus. Bagian dari itu masih ada dalam versi windows modern:

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

Cara termudah untuk menghapusnya adalah mem-boot sistem operasi yang tidak memperlakukan nama file ini sebagai istimewa. (mis. boot liveCD non-windows).

[sunting] Pengujian dilakukan pada win7-x86 ultimate:

Membuat file uji sederhana:

S: \> salin con foo.c
uji
^ Z
        1 file disalin.

Memeriksa isinya:

S: \> ketik foo.c
uji

Sekarang dengan aux .c

S: \> copy con aux.c
^ Z
Sistem tidak dapat menemukan berkas yang dicari.
        0 file disalin.

Tampaknya bagian-bagian windows masih kompatibel ke belakang.

Hennes
sumber
Tetapi file iniaux.c
Alex
3
Itu masih dimulai dengan aux, dan gaya nama file lama adalah "Nama file" dot "ekstensi". Dan saya baru saja menguji copy con aux.cpada win7 dan gagal. ( copy con test.cberhasil).
Hennes
7

Dalam hal ini jelas tentang makna khusus yang auxdiwarisi dari zaman DOS , seperti yang ditunjukkan Hennes dengan benar. Namun, bagi pembaca yang tersandung masalah ini di masa depan saya ingin menambahkan kasus lain yang memungkinkan di mana perilaku ini dapat dilihat.

Saat itulah file dibuat dengan titik trailing. Ada juga kasus yang lebih eksotis. Tetapi filename.ext.akan menjadi nama file seperti itu dan biasanya tidak bisa dihapus dari subsistem Win32. Di sinilah trik dari Karan masuk. S / dia menggunakan nama yang sebelum diteruskan ke lapisan di bawah subsistem Win32 akan diubah dari \\?\C:\...bentuknya ke "asli" (ini juga bagaimana driver filter sistem file melihatnya) bentuk \??\C:\.... Sedangkan tergantung pada versi Windows ini dapat menjadi apa yang disebut direktori objek (gunakan WinObj dari Sysinternals / Microsoft untuk mengintip ke dalam namespace pengelola objek) atau tautan simbolis (jangan dikacaukan dengan entitas yang diidentifikasi secara identik di NTFS sejak Vista) ke direktori objek lain seperti\DosDevices. Yang terakhir hanyalah satu nama dan menggambarkan bagian dari namespace manajer objek yang terlihat oleh proses Win32 secara default. Untuk lebih jelasnya lihat seri buku Windows Internal atau baca di jalur parsing khususnya di Google Project Zero (Panduan Definitif tentang Win32 ke NT Path Conversion) . Khususnya Anda mungkin ingin memperhatikan perbedaan antara Win32 File Namespaces dan Win32 Device Namespaces .

Sekarang bagaimana file seperti itu bisa dibuat di tempat pertama? Ada beberapa kemungkinan.

  1. program Win32 yang menggunakan \\?\X:awalan untuk nama jalur untuk memperpanjang panjang jalur yang tersedia dari 260 karakter menjadi sekitar 32767 karakter (lihat catatan kaki 1!) menciptakan file di tempat pertama, sehingga menghindari beberapa keterbatasan subsistem Win32.
  2. sebuah program yang di-root di subsistem yang berbeda. Subsistem POSIX sebelumnya (kemudian Interix sekarang SUA), subsistem OS / 2 (sudah lama hilang, tetapi dulu ada di NT 3.51) atau beberapa lapisan yang bukan subsistem dalam arti Windows (Cygwin, sepengetahuan saya) dibuat file atau folder. Demikian pula WSL (Windows Subsystem untuk Linux) pada Windows 10 sekarang menjadi kandidat lain.
  3. sistem operasi yang berbeda membuatnya (boot Linux paralel, misalnya).
  4. itu adalah file di jaringan yang terletak di server non-Windows.

Dua poin terakhir juga mengisyaratkan salah satu solusi yang disebutkan: boot CD live non-Windows dan hapus file.

Masalah sebenarnya dapat dibandingkan dengan kasus di mana program Win32 non-Unicode lama dihadapkan dengan nama file dari beberapa halaman kode. Seringkali ia tidak dapat "menemukan" beberapa dari mereka, karena masing-masing ANSI codepage masing-masing hanya dapat memuat 256 karakter, sedangkan UTF-16 (bukan subsetnya UCS-2, namun) secara teoritis dapat menyandikan jumlah poin kode yang hampir tak terbatas (baca topik di unicode.org dan Wikipedia ).

Semoga ini bisa membantu memahami masalah mendasar sedikit lebih banyak. Tidak ingin mengedit jawaban panjang ini menjadi salah satu jawaban lain, meskipun hanya melengkapi mereka. Jawaban yang lain benar-benar valid tanpa jawaban ini.


Catatan Kaki 1: jumlah maksimum karakter dalam path tidak absolut karena path yang dekat dengan maksimum absolut (32767 karakter) dapat diperluas oleh manajer objek dan filter sistem file atau sistem file itu sendiri (mis. Titik reparse) .

0xC0000022L
sumber
Saya suka latar belakang teknis yang ditambahkan.
Hennes
0

Saya memiliki masalah ini dan sangat frustrasi, tidak ada yang berhasil. Kemudian, saya menggunakan CD Linux Ubuntu. Di-boot dari CDROM, pergi ke mode demo, diakses di tempat file-file bermasalah dan hanya dihapus. Itu bekerja seperti mimpi.

chris frisch
sumber
1
Perlu diketahui, bahwa alasan Windows tidak dapat menghapus file, bisa jadi fakta bahwa karakter yang tidak diizinkan di Windows telah dimasukkan ke dalam nama file di Linux. Saya cukup yakin itu bukan karena Linux tidak peduli. Saya meminta moderator untuk menyetujui menghapus beberapa teks dan menjaga bagian yang dapat digunakan.
Mogget