Zasadniczo chciałbym sprawdzić, czy mam uprawnienia do otwarcia pliku, zanim faktycznie spróbuję go otworzyć; Nie chcę używać try / catch do tego sprawdzenia, chyba że muszę. Czy istnieje właściwość dostępu do plików, którą mogę sprawdzić wcześniej?
c#
.net
file-access
Horas
źródło
źródło
Odpowiedzi:
Robiłem to niezliczoną ilość razy w przeszłości i prawie za każdym razem, gdy to robiłem, myliłem się nawet podejmując taką próbę.
Uprawnienia do plików (nawet istnienie pliku) są ulotne - mogą ulec zmianie w dowolnym momencie. Dzięki prawu Murphy'ego obejmuje to w szczególności krótki okres między sprawdzeniem pliku a próbą jego otwarcia. Zmiana jest jeszcze bardziej prawdopodobna, jeśli znajdujesz się w obszarze, o którym wiesz, że musisz najpierw sprawdzić. Jednak, co dziwne, nigdy nie wydarzy się to w twoich środowiskach testowych lub programistycznych, które są dość statyczne. To sprawia, że problem jest trudny do wyśledzenia później i ułatwia wprowadzenie tego rodzaju błędu do produkcji.
Oznacza to, że nadal musisz być w stanie obsłużyć wyjątek, jeśli uprawnienia do pliku lub istnienie są złe, pomimo twojego sprawdzenia. Kod obsługi wyjątków jest wymagany , niezależnie od tego, czy wcześniej sprawdzasz uprawnienia do pliku. Kod obsługi wyjątków zapewnia wszystkie funkcje sprawdzania istnienia lub uprawnień. Ponadto, chociaż wiadomo, że programy obsługi wyjątków, takie jak ta, są wolne, ważne jest, aby pamiętać, że operacje wejścia / wyjścia dysku są jeszcze wolniejsze ... dużo wolniejsze ... a wywołanie funkcji .Exists () lub sprawdzenie uprawnień wymusi dodatkowe wyłączenie z systemu plików.
Podsumowując, wstępne sprawdzenie przed próbą otwarcia pliku jest zarówno zbędne, jak i marnotrawne. Nie ma żadnych dodatkowych korzyści w porównaniu z obsługą wyjątków, w rzeczywistości zaszkodzi, a nie pomoże, wydajności, zwiększa koszty w postaci większej ilości kodu, który musi być utrzymywany, i może wprowadzić subtelne błędy do kodu. Wstępna kontrola nie ma po prostu żadnych korzyści. Zamiast tego, poprawną rzeczą jest po prostu spróbować otworzyć plik i włożyć wysiłek w dobry program obsługi wyjątków, jeśli to się nie powiedzie. To samo jest prawdą, nawet jeśli tylko sprawdzasz, czy plik istnieje. To rozumowanie ma zastosowanie do każdego niestabilnego zasobu.
źródło
Szybka wskazówka dla każdego, kto przyjeżdża tutaj z podobnym problemem:
Uważaj na aplikacje do synchronizacji sieci, takie jak DropBox. Właśnie spędziłem 2 godziny na myśleniu, że instrukcja „using” (wzorzec usuwania) jest zepsuta w .NET.
W końcu zdałem sobie sprawę, że Dropbox nieustannie odczytuje i zapisuje pliki w tle, aby je zsynchronizować.
Zgadnij, gdzie znajduje się mój folder projektów programu Visual Studio? Oczywiście w folderze „My Dropbox”.
Dlatego, gdy uruchomiłem moją aplikację w trybie debugowania, pliki, które czytała i zapisywały, były również stale uzyskiwane przez DropBox w celu synchronizacji z serwerem DropBox. To spowodowało konflikty blokowania / dostępu.
Więc przynajmniej teraz wiem, że potrzebuję bardziej niezawodnej funkcji File Open (tj. TryOpen (), która wykona wiele prób). Dziwię się, że nie jest to już wbudowana część frameworka.
[Aktualizacja]
Oto moja funkcja pomocnicza:
źródło
using
będzie musiał być użyty przez dzwoniącego ...using
tutaj nie zadziała. Pod koniec używania blokfs
zostanie zmuszony do zamknięcia. Dasz dzwoniącemu ZAMKNIĘTY (tak bezużyteczny) strumień plików!Oto rozwiązanie, którego szukasz
tworzy to nowe uprawnienie do odczytu na podstawie widoku ścieżki do wszystkich plików, a następnie sprawdza, czy jest równe odczytowi dostępu do pliku.
źródło
Najpierw to, co powiedział Joel Coehoorn.
Ponadto: powinieneś przeanalizować założenia, które leżą u podstaw twojego pragnienia unikania używania try / catch, chyba że musisz. Typowy powód unikania logiki zależnej od wyjątków (tworzenie
Exception
obiektów działa słabo) prawdopodobnie nie ma zastosowania do kodu, który otwiera plik.Przypuszczam, że jeśli piszesz metodę, która zapełnia a
List<FileStream>
, otwierając każdy plik w poddrzewie katalogu i spodziewasz się, że duża ich liczba będzie niedostępna, możesz chcieć sprawdzić uprawnienia do pliku przed próbą otwarcia pliku, aby nie uzyskać zbyt wiele wyjątków. Ale nadal poradzisz sobie z wyjątkiem. Ponadto prawdopodobnie jest coś strasznie nie tak z projektem twojego programu, jeśli piszesz metodę, która to robi.źródło
źródło
źródło
attempts
pomijany przez ref? To nie ma sensu. Ani też testowanie<=
zamiast tylko==
.throw ex
jest to właściwe rozwiązanie .