logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C# - Long path - jak obsłużyć długie ścieżki w analizie katalogów?

16 Cze 2013 19:09 2136 22
REKLAMA
  • #1 12423011
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • REKLAMA
  • #3 12423085
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 12423132
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 12423144
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    W C# owszem, backslash jest specjalnym znakiem, ale jeżeli umieści się @ przed napisem tak jak on to zrobił, to przestaje nim być i ten zapis jest prawidłowy.

    Ustal debugerem konkretnie w którym miejscu, na której linijce kodu się wywala, bo w tej chwili komunikat mówi, że ścieżka jest za długa. Możesz spróbować odpalić testowo dla kilku plików wrzuconych do katalogu na c:
    Nie masz przypadkiem bardzo rozbudowanej struktury tych katalogów, przekraczającej, z nazwami plików, 260 znaków?

    PS. Stosowanie polskich znaków w nazwach zmiennych woła o pomstę do nieba...
  • #8 12423152
    rufek90
    Poziom 25  
    Posty: 463
    Pomógł: 106
    Ocena: 58
    Max jest 260 znaków, i tego się nie przeskoczy w ten sposób. Spróbuj sobie zrobić folder o długiej nazwie, i później kolejny o długiej nazwie itp... w pewnym momencie windows wyrzuci ci komunikat, że nie można stworzyć folderu, bo ścieżka jest za długa.

    Aby to obejść potrzebna jest zewnętrzna biblioteka (tak mi się przynajmniej wydaje). Kumpel miał ten problem i w ten sposób sobie poradził. Postaram się go zapytać i jak dowiem się więcej, to napiszę tu.
  • #9 12423174
    Konto nie istnieje
    Poziom 1  
  • #10 12423323
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Zrób to, o czym pisałem.
    Nie udzieliłeś też jednoznacznej odpowiedzi na zadane pytanie.
  • #11 12423380
    Konto nie istnieje
    Poziom 1  
  • #12 12423430
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Czy jak dla testu zamiast: D:\Dokumenty\Zapisane strony\Błędy na stronach utworzysz katalog C:\test, podmienisz na tą ścieżkę i do niego wrzucisz kilka plików .txt i .srt (ewentualnie w katalogach), to dalej się wywala (sprawdź breakpointem czy przejdzie przez wspomnianą na końcu funkcję)?

    PS. Zobacz, jak się robi takie podwójne wyszukiwanie - tutaj, zamiast FullName.Contains możesz użyć EndsWith, powinno być szybciej.
  • #13 12423486
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #14 12423567
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    No to już wiesz w czym problem. Nie liczy się tylko nazwa pliku, ale cała ścieżka.
    MUSISZ MIEĆ gdzieś plik o ścieżce dłuższej niż 260 znaków, tylko najwyraźniej nie potrafisz go znaleźć. Sorry, ale innej opcji nie ma.

    Nie wiem jaką masz strukturę tych katalogów i ile plików tam jest (zakładam, że nie są one bezpośrednio na D:\Dokumenty\Zapisane strony\Błędy na stronach, tylko w podkatalogach).

    Proponuję skopiować cały katalog D:\Dokumenty\Zapisane strony\Błędy na stronach (potem ew. ten drugi) na tym samym poziomie, zmień mu tylko jedną literę w nazwie, żeby długość pozostała taka sama.
    Podmień ścieżkę na tą kopię i odpal program. Powinien się wywalić.
    Potem kasuj kolejno po 1-2 katalogi i za każdym razem odpalaj program.
    Jak w którymś momencie przejdzie, to znaczy, że przyczyny należy szukać w tych dopiero co skasowanych. Przyjrzyj się im dokładnie, policz litery w najdłużych plikach, czyli np. D:\Dokumenty\Zapisane strony\Błędy_na_stronach\Katalog1\podkatalog\plik o jakiejś długiej nazwie.txt .
    Oczywiście sprawdź też, czy nie ma tam jakiś ukrytych plików.

    Możesz taż skopiować pierwszą połowę katalogów (plików) i zobaczyć efekt. Jak przejdzie - skopiuj z oryginalnej ścieżki tą drugą połowę, i znowu z niej kasuj połowę - tak długo, aż ustalisz, który plik / katalog generuje błąd.
  • #15 12423590
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #16 12423614
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Katalog C:\test ma krótszą nazwę niż D:\Dokumenty\Zapisane strony\Błędy na stronach. Skopiuj pliki do katalogu np. o nazwie D:\Dokumenty\Zapisane strony\Błędy_na_stronach (z podkreślnikami zamiast spacji).

    Pliku dłuższego niż ileś tam znaków nie utworzysz, choćbyś chciał - Windows wywali w odpowiednim momencie błąd za długiej ścieżki. Mi na Win7 na C:\ udało się utworzyć ścieżkę z podfolderami liczącą max. 251 znaków.
  • #17 12423658
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #18 12423669
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Hmmm, bo Windows korzysta ze swoich funkcji WinAPI a ty z .NET?
  • #19 12423691
    Konto nie istnieje
    Poziom 1  
  • #21 12423740
    Konto nie istnieje
    Poziom 1  
  • #22 12423853
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    youmound napisał:
    Ale na pewno są na to sposoby ?
    Pewnie są... Pierwszy, z którego bym skorzystał, to umieścić kod w try...catch... i przechwytywać wyjątek (PathTooLongException albo bardziej ogólny) i poinformować użytkownika, że wystąpił błąd z powodu użycia zbyt długiej ścieżki - niech sobie ją skróci.

    Każdy kto ma choć trochę obycia z komputerem wie, że nie należy zagnieżdżać za bardzo katalogów bo dostanie się błąd - pozostałych należy o tym poinformować stosownym komunikatem.

    Tak naprawdę to w tym kodzie wyjątku nie zwraca funkcja di.GetFiles(...), a próba wykonania plik.FullName.Contains(...). Jeżeli zamiast FullName użyć po prostu Name, wyjątku nie będzie, bo samo di.GetFiles() też nie rzuca wyjątkiem przy zbyt długiej nazwie. Oczywiście, zakładając, że chcesz szukać wzorca tylko w nazwie pliku, nie w całej ścieżce.

    Ostatecznie, choć nie wiem czy to ma sens, użyć funkcji WinAPI w C# - może kolega rufek90 coś podeśle ew. poszukaj czegoś sam na google.

    PS. To może na koniec podziel się wiedzą co w końcu pomogło? Znalazłeś za długą ścieżkę usuwając katalogi? Czy może skróciłeś nazwę? Bo samo przekopiowanie plików do katalogu o takiej samej długości nie powinno pomóc - chyba, że Windows w trakcie kopiowania automatycznie przyciął sobie zbyt długie nazwy...
  • #23 12424445
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

✨ W dyskusji poruszono problem obsługi długich ścieżek w C# podczas analizy katalogów. Użytkownik napotkał błąd związany z przekroczeniem maksymalnej długości ścieżki, która wynosi 260 znaków. Odpowiedzi sugerowały, że w C# znak backslash () jest znakiem specjalnym, co wymaga użycia podwójnego backslasha (\) lub prefiksu @ przed ścieżką. Użytkownicy wskazali, że problem może wynikać z zagnieżdżonych katalogów lub długich nazw plików. Proponowano również użycie WinAPI do obsługi długich ścieżek oraz implementację bloków try-catch do przechwytywania wyjątków. Ostatecznie, użytkownik zdołał rozwiązać problem poprzez usunięcie nieistotnych plików, co pozwoliło na prawidłowe działanie programu.
Wygenerowane przez model językowy.
REKLAMA