Tại sao tập tin này dường như không tồn tại khi cố gắng xóa nó?


9

Một tháng trước, tôi đã gỡ bỏ nguồn Linux trong một thư mục trong Cygwin (Tôi tò mò liệu nó có được biên dịch với MinGW hay không vì máy tính khác của tôi chạy Linux là một Sempron lõi đơn chậm). Tôi đã cố xóa nó, nhưng chỉ còn 1 tệp và nó sẽ không xóa ...

Cygwin cư trú C:\cygwinvà tôi đã gỡ bỏ nguồn này C:\cygwin\src\linux-3.7.1. Nó không được biên dịch ... Vì vậy, tôi đã cố gắng xóa thư mục. Nó đã diễn ra tốt đẹp, cho đến cuối cùng, khi tôi nhận ra không phải tất cả các tập tin đều bị xóa. Tôi đã thử xóa linux-3.7.1thư mục một lần nữa và một lỗi xuất hiện:

Không tìm thấy bảng mục

Tôi mở thư mục và thấy rằng có 1 tệp nguồn còn lại : aux.c, nằm trong C:\cygwin\src\linux-3.7.1\drivers\gpu\drm\nouveau\core\subdev\i2c\aux.c.

Nó sẽ không:

  • Xóa bỏ
  • Mở
  • Di chuyển

Thuộc tính chung:

Chung

Thuộc tính bảo mật:

Bảo vệ

Làm cách nào để xóa tệp này?


Được rồi, chạy nó vào lúc này
Alex

Xong, không hoạt động mặc dù ...
Alex

1
Không nên làm việc. Không thể xóa nó từ bên trong DOS / windows như được thiết kế. Do đó, đây không phải là lỗi mà bạn có thể sửa theo cách này.
Hennes

Câu trả lời:


14

Hãy thử điều này từ một dấu nhắc lệnh (nâng cao):

del \\?\C:\cygwin\src\linux-3.7.1\drivers\gpu\drm\nouveau\core\subdev\i2c\aux.c

Ok aux.cđã bị xóa, nhưng bây giờ thư mục `src` rõ ràng đang được sử dụng khi tôi cố gắng xóa nó
Alex

Không có gì ẩn giấu bên trong nó? Có lẽ rd /s /q \\?\C:\cygwin\srcsẽ giúp.
Karan

In kết quả đầu ra mà `src` đang sử dụng
Alex

2
Karan: Ồ, thông minh. Tránh không gian tên hệ thống tập tin bình thường. @Alex Yan: Không có cửa sổ cmd nào mở trong thư mục?
Hennes

Vâng, bạn nên thực hiện thủ thuật trừ khi có thứ gì đó bị giữ trong thư mục hoặc tệp trong đó ... Đóng tất cả các cửa sổ / ứng dụng đang mở khác và kiểm tra Thuộc tính của src. Kích thước và số lượng tập tin bên trong được hiển thị là gì?
Karan

13

Vấn đề bạn gặp phải là do các đặt phòng DOS cổ đại.

Các tập tin trong danh sách dưới đây có ý nghĩa đặc biệt. Một phần trong số đó vẫn còn hiện diện trong các phiên bản windows hiện đại:

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

Cách dễ nhất để xóa chúng là khởi động một hệ điều hành không coi các tên tệp này là đặc biệt. (ví dụ khởi động bất kỳ liveCD không phải windows).

[sửa] Các thử nghiệm được thực hiện trên win7-x86 cuối cùng:

Tạo một tệp thử nghiệm đơn giản:

S: \> sao chép con foo.c
kiểm tra
^ Z
        1 tập tin được sao chép.

Kiểm tra nội dung:

S: \> gõ foo.c
kiểm tra

Bây giờ với aux .c

S: \> sao chép con aux.c
^ Z
Hệ thống không thể tìm thấy các tập tin được chỉ định.
        0 tập tin được sao chép.

Có vẻ như các phần của cửa sổ vẫn tương thích ngược.


Nhưng tập tin này làaux.c
Alex

3
Nó vẫn bắt đầu với phần bổ trợ và kiểu tên tệp cũ là "Tên tệp" chấm "phần mở rộng". Và tôi chỉ thử nghiệm copy con aux.ctrên win7 và nó đã thất bại. ( copy con test.ckhông hoạt động).
Hennes

7

Trong trường hợp này rõ ràng là về ý nghĩa đặc biệt của việc auxkế thừa từ thời DOS , như Hennes đã chỉ ra một cách chính xác. Tuy nhiên, đối với những độc giả vấp phải điều này trong tương lai, tôi muốn thêm một trường hợp có thể khác mà hành vi này có thể được nhìn thấy.

Đó là khi một tập tin được tạo ra với một dấu chấm. Có nhiều trường hợp kỳ lạ là tốt. Nhưng filename.ext.sẽ là một tên tệp như vậy và thông thường không thể xóa khỏi hệ thống con Win32. Đây là nơi mà mánh khóe từ Karan xuất hiện. Anh ta sử dụng một tên mà trước khi được chuyển đến lớp bên dưới hệ thống con Win32 sẽ được thay đổi từ \\?\C:\...dạng của nó thành "bản địa" (đây cũng là cách trình điều khiển bộ lọc hệ thống tệp nhìn thấy nó) hình thức \??\C:\.... Trong khi tùy thuộc vào phiên bản Windows, đây có thể là thư mục đối tượng được gọi là (sử dụng WinObj từ Sysiternals / Microsoft để nhìn vào không gian tên của trình quản lý đối tượng) hoặc liên kết tượng trưng (không bị nhầm lẫn với thực thể có tên giống hệt trong NTFS kể từ Vista) đến một thư mục đối tượng khác như\DosDevices. Cái sau chỉ là một tên và mô tả một phần của không gian tên trình quản lý đối tượng hiển thị cho các quy trình Win32 theo mặc định. Để biết thêm chi tiết, hãy xem loạt sách Windows Internals hoặc đọc phần phân tích đường dẫn cụ thể trên Project Zero của Google (Hướng dẫn dứt khoát về Chuyển đổi đường dẫn Win32 sang NT) . Cụ thể, bạn có thể muốn chú ý đến sự khác biệt giữa Không gian tên tệp Win32Không gian tên thiết bị Win32 .

Bây giờ làm thế nào một tập tin như vậy có thể được tạo ra ở nơi đầu tiên? Có một số khả năng.

  1. một chương trình Win32 sử dụng \\?\X:tiền tố cho tên đường dẫn để mở rộng độ dài đường dẫn có sẵn từ 260 ký tự lên khoảng 32767 ký tự (xem chú thích 1!) đã tạo tệp ở vị trí đầu tiên, do đó tránh được một số hạn chế của hệ thống con Win32.
  2. một chương trình bắt nguồn từ một hệ thống con khác nhau. Hệ thống con POSIX trước đây (sau này là Interix bây giờ là SUA), hệ thống con OS / 2 (đã có từ lâu, nhưng đã từng tồn tại trên NT 3.51) hoặc một lớp nào đó không chính xác là hệ thống con theo nghĩa Windows (Cygwin, theo hiểu biết của tôi) các tập tin hoặc thư mục. Tương tự WSL (Hệ thống con Windows cho Linux) trên Windows 10 bây giờ là một ứng cử viên khác.
  3. một hệ điều hành khác đã tạo ra nó (ví dụ khởi động Linux song song).
  4. đó là một tệp trên chia sẻ mạng nằm trên máy chủ không phải của Windows.

Hai điểm cuối cùng cũng gợi ý về một trong những biện pháp được đề cập: khởi động CD trực tiếp không phải của Windows và xóa (các) tệp.

Vấn đề thực sự có thể được so sánh với trường hợp một chương trình Win32 không phải là Unicode cũ phải đối mặt với tên tệp từ nhiều trang mã. Thông thường, nó sẽ không thể "tìm thấy" một số trong số chúng, bởi vì mỗi bảng mã ANSI tương ứng chỉ có thể chứa 256 ký tự, trong khi UTF-16 (tuy nhiên không phải là tập hợp con UCS-2) về mặt lý thuyết có thể mã hóa số lượng điểm mã gần như không giới hạn (đọc về chủ đề trên tại unicode.orgWikipedia ).

Hy vọng điều này sẽ giúp hiểu các vấn đề cơ bản hơn một chút. Không muốn chỉnh sửa câu trả lời dài này thành một trong những câu trả lời khác, mặc dù nó chỉ bổ sung cho họ. Các câu trả lời khác là hoàn toàn hợp lệ mà không có điều này.


Chú thích 1: số lượng ký tự tối đa trong đường dẫn không tuyệt đối vì đường dẫn gần với mức tối đa tuyệt đối (32767 ký tự) có thể được mở rộng bằng cả trình quản lý đối tượng và bộ lọc hệ thống tệp hoặc chính hệ thống tệp (ví dụ: các điểm lặp lại) .


Tôi yêu nền kỹ thuật bổ sung.
Hennes

0

Tôi đã có vấn đề này và rất thất vọng, không có gì làm việc. Sau đó, tôi đã sử dụng CD Linux Ubuntu. Khởi động từ CDROM, chuyển sang chế độ demo, truy cập vào nơi chứa các tệp rắc rối và chỉ cần xóa chúng. Nó hoạt động như một giấc mơ.


1
Xin lưu ý rằng lý do khiến Windows không thể xóa tệp, có thể là do các ký tự không được phép trong Windows đã được đặt vào tên tệp trên Linux. Tôi khá chắc chắn rằng không phải vì Linux không quan tâm. Tôi yêu cầu người điều hành phê duyệt loại bỏ một số văn bản và giữ phần có thể sử dụng được.
Mogget
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.