Ustalanie prawdziwej nazwy pliku

0

Chodzi o to, że jako parametr podawana jest nazwa pliku. Już doczytałem, że funkcja Path.GetFullPath podaje nazwę pliku z pełną ścieżką. Okazuje się, że to jeszcze nie do końca. Na przykład chce sprawdzić istnienie pliku za pomoca File.Exists. Załóżmy, że jest plik o nazwie JakisPlik.txt. Jak w Windows wpiszę File.Exists("JaKiSpLiK.txt"), to zwróci true, można też otworzyć, natomiast w Linux nie znajdzie, bo ten pierwszy nie rozróżnia wielkich i małych liter.

W takim razie, jak wpiszę nazwę C:\usERs\abc\DesktOP\JakiSPLik.tXT i za pomocą File.Exists stwierdzę jego istnienie, to jak uzyskać prawdziwą nazwę pliku, którą system zobaczył i że np. brzmi C:\Users\abc\Desktop\JakisPlik.txt?

Ewentualnie: W jaki sposób można w c# stwierdzić czy dany system operacyjny, na którym uruchomiony jest program, rozróżnia wielkie i małe litery w nazwach plików?

2

Możesz użyć metody Directory.EnumerateFiles i wybrać sobie to czego szukasz

Directory.EnumerateFiles("path", "filename", new EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive });

0

Ten Directory.EnumerateFiles to jest chyba to samo, co Directory.GetFiles, tylko zwraca inny typ wyniku (IEnumerable lub string[]).

Propozycja jest słuszna, ale tak naprawdę wracamy do punktu wyjścia. W Windows zadziała, a w Linux może źle trafić w przypadku zaistnienia dwóch plików o tej samej nazwie, ale jeden małymi, drugi wielkimi literami. Co myślisz o takim rozwoju Twojej propozycji mniej więcej w ten sposób:

if (File.Exists("path" + "filename"))
{
    string TrueFileName = Directory.EnumerateFiles("path", "filename", new EnumerationOptions { MatchCasing = MatchCasing.CaseSensitive });

    string TrueFileName0 = Directory.EnumerateFiles("path", "filename", new EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive });

    if (TrueFileName == "") TrueFileName = TrueFileName0;

    Console.Write("True file name: " + TrueFileName);
}
else
{
    Console.Write("File not found");
}

Mówiąc językiem ludzkim szuka pliku osobno z odróżnianiem i bez odróżniania wielkości. Jeżeli znaleziono plik z odróżnianiem wielkości, to taki się przyjmuje, a jeżeli nie znaleziono, to przyjmuje się plik znaleziony bez odróżniania wielkości.

Inaczej niż przez podwójne wyszukiwanie to się chyba nie da. File.Exists po to, żeby zablokować sytuację, w Linux, w której znajdzie plik o nazwie małymi literami przy podaniu nazwy wielkimi.

2

Po co 2 wyszukania? Wydaje mi sie, że EnumerateFiles zwróci nazwy plików takie jakimi są. Więc jeśli masz już jakiś wynik to możesz wyszukać nazwę pasującą do klucza używając odpowiedniego porównania

1

Zamiast robić dwa porównania, poszukaj raz z CaseInsensitive a potem sprawdź czy to co Ci znajdzie odpowiada temu co szukałeś (już biorąc po uwagę wielkość znaków).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.