2010-04-30 8 views
6

W pewnym momencie plik pojawił się w jednym z moich katalogów, a na końcu jego rozszerzenia znajduje się spacja - nazywa się "test.txt". Dziwne jest to, że Directory.GetFiles() zwraca mi ścieżkę tego pliku , ale nie mogę odzyskać informacji o pliku z klasą FileInfo.Pusta przestrzeń po rozszerzeniu pliku -> dziwne zachowanie FileInfo

Błąd objawia tutaj:

DirectoryInfo di = new DirectoryInfo("c:\\somedir"); 
FileInfo fi = di.GetFileSystemInfos("test*")[0] as FileInfo; 
//correctly fi.FullName is "c:\somedir\test.txt " 
//but fi.Exists==false (!) 

Czy klasa FileInfo złamany? Czy mogę w jakiś sposób pobrać informacje o tym pliku? Naprawdę nie wiem, jak ten plik pojawił się w moim systemie plików i nie mogę odtworzyć ich więcej.

Wszystkie moje próby utworzenia nowego pliku z tym typem rozszerzenia nie powiodły się, ale teraz mój program jest zawieszany podczas jego szyfrowania . Mogę z łatwością poradzić sobie z wyjątkiem, gdy znajduję plik, ale jestem ciekaw, czy jestem ciekawy!

+0

Czy uruchomiłeś narzędzie do sprawdzania dysku OS, aby upewnić się, że nie jest on uszkodzony? Czy możemy słusznie założyć, że jest to pod Windows? Jeśli tak, która wersja? – ChrisBD

+0

Windows Vista Business x86, ale jestem pewien, że sam utworzyłem plik, około rok temu, zgodnie z datą – Axarydax

Odpowiedz

5

Kończenie nazw plików spacją jest dokumentowane jako zły pomysł.

Od MSDN "Naming Files, Paths, and Namespaces (Windows)":

  • Nie zakończyć nazwę pliku lub katalogu ze spacją lub kropką. Mimo że bazowy system plików może obsługiwać takie nazwy, powłoka systemu Windows i interfejs użytkownika tego nie obsługują.

Również artykuł KB "INFO: Filenames Ending with Space or Period Not Supported":

Problemy mogą pojawić się, gdy klient Macintosh tworzy plik na serwerze Windows NT. Kod do usuwania spacji i kropek nie jest wykonywany, a użytkownik Macintosha otrzymuje poprawną nazwę przestankową. Interfejsy API Win32 FindFirstFile() i FindNextFile() zwracają nazwę pliku kończącą się spacją lub kropką; jednak nie ma możliwości utworzenia lub otwarcia pliku przy użyciu interfejsu Win32 API.

DirectoryInfo prawdopodobnie używa FindFirstFile() i przyjaciół do tworzenia wykazów katalogów. File.Exists jest najprawdopodobniej zaimplementowany poprzez GetFileAttributes(), który prawdopodobnie cierpi na ten sam problem co CreateFile() i zgłosi nieistniejący plik.

W związku z tym nie stanowi to problemu w .NET, ale w samym systemie Windows.

4

Tak, wiem o tych plikach. Dostałem też kiedyś taką bestię. Aby się tego pozbyć, nie wiem o sposobie programowania w języku C#, ale starą dobrą komendą jest twój przyjaciel:

Otwórz okno konsoli w podanym folderze (lub wykonaj cmd i przejdź do folderu z cd polecenie). Teraz wpisz dir /x, aby pobrać skrót plików w tym katalogu. Użyj tej nazwy, aby usunąć lub zmienić nazwę pliku za pomocą komendy del lub .

+0

Dziękuję, Oliver. Ten dir/x zrobił lewę. Miałem ten sam problem i próbowałem usunąć plik przy użyciu pełnej nazwy + rozszerzenia, ale powiedziano, że pliku nie można znaleźć. Jednak w końcu udało mi się go usunąć za pomocą skrótu. –

+0

Będziesz mógł manipulować tymi plikami poprzez ominięcie interfejsu Win32 API, tj. Poprzez podsystem POSIX (polecenia 'cygwin', takie jak' mv' i 'touch' będą z łatwością manipulować tymi nazwami plików) lub ewentualnie poprzedzając ścieżkę L" \ \? \ "(to również może ominąć idiosynkrazje Win32 APIs.) – vladr