W jaki sposób cyfry po ~ przypisane są do krótkich nazw plików w oknach?

2

Windows nadal używa ~ do skracania plików i katalogów o długich nazwach. Możesz zobaczyć „krótką” nazwę, wpisując dir /X w wierszu polecenia.

Moje pytanie brzmi: jak cyfry są przypisane do krótkich nazw plików? Wydaje się, że nie jest alfabetyczny ani nie działa w oparciu o czas tworzenia pliku.

Na przykład:

Tworzę nowy plik tekstowy: C:\reallylongfilenameB.txt

Potem uciekam dir /X i zobacz krótką nazwę pliku B REALLY~1.TXT

Tworzę drugi plik tekstowy: C:\reallylongfilenameA.txt

Potem uciekam dir /X i zobacz krótką nazwę plikuA REALLY~2.TXT

Następnie cofam zegar o jeden dzień, usuń C:\reallylongfilenameA.txt a następnie utwórz go ponownie, tworząc datę utworzenia C:\reallylongfilenameA.txt 1 dzień wcześniej C:\reallylongfilenameB.txt.

biegnę dir /X i C:\reallylongfilenameA.txt krótka nazwa jest nadal REALLY~2.TXT.

Biorąc pod uwagę ten przykład, czy istnieje jakiś sposób na skrócenie nazwy C:\reallylongfilenameA.txt być REALLY~1.TXT?

FGreg
źródło

Odpowiedzi:

3

Jak rozumiem, NTFS automatycznie przypisuje trwałe nazwy plików 8.3 podczas tworzenia. Kiedy uruchamiasz dir / X, nie skraca to nazw plików w locie, szuka wstępnie przypisanych krótkich nazw.

Źródło: http://en.wikipedia.org/wiki/8.3_filename

Jack
źródło
Hmm interesujące. Aby odpowiedzieć na mój przykład, jeśli przeniosę oba pliki na C:\temp potem ruszaj się reallylongfilenameA.txt wrócić do C:\ przed reallylongfilenameB.txt; pliki będą REALLY~1.TXT i plik B będzie REALLY~2.TXT
FGreg
Nie, nie sądzę. Możliwe, że w katalogu bez odpowiedniego NAPRAWDĘ ~ 1.TXT będzie REALLY ~ 2.TXT, jeśli wyjmiesz pierwszy.
Jack
Tak, to prawda. Robiłem inny punkt, że mogę zmienić plik „1”, a który „2”, przesuwając oba z katalogu, a następnie przesuwając plik „2” z powrotem do katalogu (co czyni go „1” ”). Btw, spróbowałem tego i działa na Win 7.
FGreg
7

Jak zauważył Jack w swojej odpowiedzi, krótka nazwa jest przypisywana podczas tworzenia pliku (lub zmiany nazwy lub przeniesienia). Wartość zależy zarówno od długiej nazwy pliku, jak i od tego, jakie inne nazwy już istnieją.

Dokładny algorytm przypisywania krótkich nazw jest nieudokumentowany i nie ma gwarancji, że algorytm pozostanie stały między wersjami systemu Windows lub nawet między różnymi formatami systemu pamięci masowej. Nie należy pisać kodu zależnego od konkretnego algorytmu przypisywania krótkich nazw.

Istnieją zarówno ograniczenia projektowe, jak i błędy wynikające z krótkich nazw plików. Przykładem ograniczenia projektowego jest del *.txt może usunąć nazwany plik something.txt2 ponieważ rozszerzenie krótkiej nazwy prawdopodobnie będzie .txt, a maski źródłowe sprawdzają zarówno długie, jak i krótkie nazwy. Zobacz sekcję zatytułowaną „BŁĄD - Krótkie nazwy plików 8.3 mogą przerwać opcje / D i / S „ w Jakie są nieudokumentowane funkcje i ograniczenia polecenia FINDSTR systemu Windows? na przykład błędu wynikającego z krótkich nazw.

Woluminy NTFS mogą mieć wyłączone krótkie nazwy plików (pozostaną krótkie nazwy, które istniały przed ich wyłączeniem). Wiele osób (organizacji) wyłącza krótkie nazwy w swoim systemie z powodu problemów, które mogą powodować.

Aktualizacja

Oto definitywny argument, dlaczego marnowanie czasu na ustalanie algorytmu generowania krótkich nazw plików jest stratą czasu FSUTIL pozwala określić dowolną krótką nazwę pliku, o ile nie istnieje ona już w tym folderze.

Oto odpowiednia dokumentacja pomocy FSUTIL

C:\test>fsutil file
---- FILE Commands Supported ----

findbysid               Find a file by security identifier
queryallocranges        Query the allocated ranges for a file
setshortname            Set the short name for a file
setvaliddata            Set the valid data length for a file
setzerodata             Set the zero data for a file
createnew               Creates a new file of a specified size
queryfileid             Queries the file ID of the specified file
queryfilenamebyid       Displays a random link name for the file ID

C:\test>fsutil file setshortname /?
Usage : fsutil file setshortname <filename> <shortname>
   Eg : fsutil file setshortname C:\testfile.txt testfile
dbenham
źródło